You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmonero/tests/txsearch_tests.cpp

515 lines
144 KiB

#include "src/MicroCore.h"
#include "../src/CurrentBlockchainStatus.h"
#include "../src/ThreadRAII.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "helpers.h"
#include "mocks.h"
namespace
{
using json = nlohmann::json;
//class OUTPUTIDENT_TEST : public ::testing::Test
//{
//public:
//static void
//SetUpTestCase()
//{
//string config_path {"../config/config.json"};
//config_json = xmreg::BlockchainSetup::read_config(config_path);
//}
//protected:
//virtual void
//SetUp()
//{
//bc_setup = xmreg::BlockchainSetup{net_type, do_not_relay, config_json};
//cbs_mock = make_shared<MockCurrentBlockchainStatus>();
//}
//network_type net_type {network_type::TESTNET};
//bool do_not_relay {false};
//xmreg::BlockchainSetup bc_setup;
//std::shared_ptr<MockCurrentBlockchainStatus> cbs_mock;
//static json config_json;
//};
//json OUTPUTIDENT_TEST::config_json;
//string addr_9wq79 {"9wq792k9sxVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4bh2tCh"};
//string viewkey_9wq79 {"f747f4a4838027c9af80e6364a941b60c538e67e9ea198b6ec452b74c276de06"};
//TEST_F(OUTPUTIDENT_TEST, NonDefaultConstruction)
//{
//ADDR_VIEWKEY_FROM_STRING(addr_9wq79, viewkey_9wq79, net_type);
//transaction tx;
//crypto::hash tx_hash;
//bool is_coinbase {false};
//xmreg::OutputInputIdentification oi {&address, &viewkey, &tx,
//tx_hash, is_coinbase};
//EXPECT_TRUE(true);
//}
//TEST_F(OUTPUTIDENT_TEST, IncomingPreRingctTransaction)
//{
//// private testnet tx_hash 01e3d29a5b6b6e1999b9e7e48b9abe101bb93055b701b23d98513fb0646e7570
//string tx_hex {"0100020280e08d84ddcb0107041e6508060e1df9733757fb1563579b3a0ecefb4063dc66a75ad6bae3d0916ab862789c31f6aa0280e08d84ddcb01075f030f17031713f43315e59fbd6bacb3aa1a868edc33a0232f5031f6c573d6d7b23e752b6beee10580d0b8e1981a02e04e4d7d674381d16bf50bdc1581f75f7b2df591b7a40d73efd8f5b3c4be2a828088aca3cf02025c3fb06591f216cab833bb6deb2e173e0a9a138addf527eaff80912b8f4ff47280f882ad1602779945c0e6cbbc7def201e170a38bb9822109ddc01f330a5b00d12eb26b6fd4880e0bcefa757024f05eb53b5ebd60e502abd5a2fcb74b057b523acccd191df8076e27083ef619180c0caf384a302022dffb5574d937c1add2cf88bd374af40d577c7cc1a22c3c8805afd49840a60962101945fd9057dd42ef52164368eab1a5f430268e029f83815897d4f1e08b0e00873dbf5b4127be86ba01f23f021a40f29e29110f780fa0be36041ecf00b6c7b480edb090ba58dea640ca19aa4921a56c4b6dcbf11897c53db427dfdbc2f3072480b6c02f409b45c5d2401a19d8cfb13d9124d858d2774d9945f448f19e1e243e004588368813689c1c1be4e1242c633b7a2eb4936546fda57c99dac7fab81e40d0512e39d04ce285f96ac80f6d91ee39157189d73e198fa6b397bd34d8685dbf20e3f869043b686c291f8d4401f673978c683841ec39c45ce06564ccf87c68a080ad17bcce3d7240cd8d57ecbb190fef27578679cdd39ea3c868ab65d6d1d2c20062e921ceea054f755ceef8cd24e54078f9a5bedea2ca59d90ad277bd250c90605b3dd832aa15a4eb01080210ade74638f1558e203c644aa608147c9f596ce3c03023e99f9ca5b3cae41cbd230bc20f2b87f1e06967c852115abc7e56566ddaf09b5774568375fa0f27b45d946cfb2859f1c7a3ad6b7a8e097e955a6ee77c6db0b083dbda85b317dcd77e4be29079420bf683a91ac94feb0f788d5e3dfe72bef028768d76f9ebffd4cb2fd4a314e293df51cb43f12091632e93f4f97fdab7ab60dd50611233fbb1048dccd6478184b914710c894d8116620fcfd09d73ef304c90af210a4724c9e8adb2c47396a67944d6fe827a9b06f7a3c3b6cd2946f328cc306e0a0d194443734cc90fb94ccdb74f8fa7a19690793ddc2b0b06e52d0d4d8530ac227d58a2936fbbf18bbbc2af03443a44ff2a844be527371fedc03c50cce200e8e2b4fdb501e2fba103aafc2487be7faaa83f3894bdcfad873a6697ad930500bc56e28139ef4c6d9b8ee06390b4bcb1b6bfcc6e3136be89e3bdccff50d104906d354569aedfd8b2a5cb62b8738218760a9ebbc5dff3de038ab2e0369f28e3d0d921d28b388acdf69988b5c77120de5317be614da7c774f1f815a7137625da90f0342ca5df7bbc8515066c3d8fa37f1d69727f69e540ff66578bd0e6adf73fa074ce25809e47f06edc9d8ac9f49b4f02b8fd48ef8b03d7a6e823c6e2fc105ee0384a5a3a4bfefc41cf7240847e50121233de0083bbd904903b9879ecdd5a3b701a2196e13e438cf3980ab0b85c5e4e3595c46f034cb393b1e291e3e288678c90e9aac0abe0723520d47e94584ff65dfec8d4d1b1d2c378f87347f429a2178b10ad530bfe406441d7b21c1f0ea04920c9715434b16e6f5c561eab4e8b31040a30b280fc0e3ebc71d1d85a6711591487a50e4ca1362aae564c6e332b97da65c0c07"};
//// the tx has only one output for 10 xmr, so we check
//// if we can identify it.
//TX_FROM_HEX(tx_hex);
//ADDR_VIEWKEY_FROM_STRING(addr_9wq79, viewkey_9wq79, net_type);
//xmreg::OutputInputIdentification oi {&address, &viewkey, &tx,
//tx_hash, is_tx_coinbase};
//oi.identify_outputs();
//EXPECT_EQ(oi.identified_outputs.size(), 1);
//EXPECT_EQ(oi.identified_inputs.size(), 0);
//EXPECT_EQ(oi.get_tx_hash_str(), tx_hash_str);
//EXPECT_EQ(oi.get_tx_prefix_hash_str(), tx_prefix_hash_str);
//EXPECT_EQ(oi.get_tx_pub_key_str(), tx_pub_key_str);
//EXPECT_EQ(oi.get_mixin_no(), 7);
//EXPECT_EQ(oi.total_received, 10000000000000ull);
//EXPECT_FALSE(oi.tx_is_coinbase);
//EXPECT_FALSE(oi.is_rct);
//auto out_info = oi.identified_outputs[0];
//EXPECT_EQ(pod_to_hex(out_info.pub_key),
//"2dffb5574d937c1add2cf88bd374af40d577c7cc1a22c3c8805afd49840a6096");
//EXPECT_EQ(out_info.amount, 10000000000000ull);
//EXPECT_EQ(out_info.idx_in_tx, 4);
//EXPECT_TRUE(out_info.rtc_outpk.empty());
//EXPECT_TRUE(out_info.rtc_mask.empty());
//EXPECT_TRUE(out_info.rtc_amount.empty());
//}
//// private testnet wallet 9wq792k9sxVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4bh2tCh
//// viewkey f747f4a4838027c9af80e6364a941b60c538e67e9ea198b6ec452b74c276de06
//// spendkey 509a9761fde8856fc38e79ca705d85f979143524f178f8e2e0eb539fc050e905
//// seed: deftly large tirade gumball android leech sidekick opened iguana voice gels focus poaching itches network espionage much jailed vaults winter oatmeal eleven science siren winter
//string addr_9wq792k {"9wq792k9sxVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4bh2tCh"};
//string viewkey_9wq792k {"f747f4a4838027c9af80e6364a941b60c538e67e9ea198b6ec452b74c276de06"};
//// ./xmr2csv --testnet -b /home/mwo/testnet/node_01/testnet/lmdb/ -a 9wq792k9sxVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4bh2tCh -v f747f4a4838027c9af80e6364a941b60c538e67e9ea198b6ec452b74c276de06
//string known_outputs_csv_9wq792k {"./res/outputs_testnet_9wq792k9.csv"};
//TEST_F(OUTPUTIDENT_TEST, OutgingPreRingctTransaction)
//{
//// private testnet tx_hash 0889658a54ddfaa61f62fdc0393adc498e1227195d413de45c5f0e0da3f5068d
//string tx_hex {"0100020280e08d84ddcb0107b902e401081b2c10418ba25b21dc2e9fd3d6d8dd69c14888ab0ed429f8cc86a7edba20bdd2bde61bab0280c0caf384a30207d10194012438201e78879c4ee5f780a4fcabc5ce20716080392fc4715db6334f956e210283beed920f0580c0caf384a302020ffede2e6e4a3d613f6ebcca9d3337d54c5b65f7095cc04faf6c9408206b463c80f882ad16021b48cdc46b84e348596f35a0fb4f0107da3a7e5f8b486be6a36fc90ff052117e80d0b8e1981a02e6de1aa8176921a8d5f8ef02a12004f5183f77a601c347f84e7be18c400572e18088aca3cf02022f061ade6afb847d57d29609255089b477d2c33c34d06e13ec5982d18eb785c580c0f9decfae010211c7792d1a8d8c23bbd0e2c4c79b28a711fa4d6ff64906013ddd2b8bca42a6d444022100000000000000000000000000000000000000000000006f70656e6d6f6e65726f0189bb4ab10d9ae0b84096fe0f4b95da56e3949b71c6eca5f284a4a02c83ed174675d6b1d2e529f5e4199bb738a47e7f50fc7acbf86a3908eb0c3023013ea9e808974dd6e0c0fe2c9853d316d63a35206628790b60997a22cefb9383762ba05a0fb11987072d29d76b172700ea6b9cb61ddbdea60372b35de748f9a7fc0d18f30a02b76e272c76446d828b6cef9a2df96f867792da27f08ca116dca121f73bcf09fe4fff1a1b8a099fffafefac87f10ecdaf02f48e0b903ced2d737bcb803f0c0525588ed99e71b21c35878ce0697990bf768bc35e0e6841bf1cf91c1fc116ee0a01343ec7e52ded6bdb89571b40590834d4c04715b4eb28102dad54b455dd6d03380e9eac3c058159e7fa4f5d3da30b3eda24c7e49a87e1523e5b478efdb8020fa03a4788d214a7ec64454366525ebf66ef8692a0db97a2ff96e1ad926e315105104c7ef19f59aff25265f54489f7e0fdde6205e6f62b4beb6b0d5a2a233a4807e5460bd83dfa3929b56bd84705cee12ce7bcaca09539bd128fc9e7513a3e63022297c65ef1ac04bb1807b85fa3ef38342aa8342ec33dfe4979a1590d372218034649bbb7975d6790e04105cef27a6337996896758f4fa6a962425fc802dd790114020c4f14efe604f00b8f829d6c82bd2c9719a60c39565944998d43f299070ab78325c8a20557e03dd2e50e516503d16bd436b5af949a978097e0ce347a700c13c5ce0d039ea7bfc7cc8e975c0710e74b6b0930ffd597eaf80c0fdc18711e0e6c8e1aed3c2bd4ff035df0745e69d30ec0dff351c0d780cda8873c010419d209c19d6fc4c366911170892c6e696709069e6469018ff2c61f5f42b283bd4c590a3e5f71f7934635c1e7cca1cbf0ec91517ce65673c1b6c6c961625537b2e93208db342fb9c2f246c6d636adf66bece8bae648be290140452d63c6d87fb3ff990c86725d7bc4968cac48f10d7b6a4d35b63e3040c42f6e76e7224fa308a042b10807cd36ffe28daca3e2a755645be3f588565f9ee79b19b7f8c572a872bb61fd08c9d6473dfe2a5ae4f100744ed91e2e8817ef417309c4d0f4a5023272b87b8b00c08ee85c037417b5241e6715db7b0e932ef7e08cba00914bf485a46690f0370016d3e2ca265accec86c295cd02c13d67fa6bcc1f51803d537eaef804bdeaef05316c79554916dc5afb6ac1581436a26ac5cd687d83b4ccbbfae8e230eac2aa0c2b87f2db0b70cea9ad4cf9cb3218c4aa37da05245bc401a1ea4afcdcd833d40fadc38c6d38bd75fe63a364a0bed1c9b6656b4f803b944e5947d1c398a9eed200"};
//TX_FROM_HEX(tx_hex);
//ADDR_VIEWKEY_FROM_STRING(addr_9wq792k, viewkey_9wq792k, net_type);
//// the ring members data from the above tx
////
//// this hex is obtained using onion explorer runnign with --enbale-as-hex flag
//// it is hex, serializied representation of of map of key_images
//// with corresponding ring members output_data_t info structure
//// we do this so that we just mack all the calls, instead of
//// accessing real blockchain for this data.
//string ring_member_data_hex {"011673657269616c697a6174696f6e3a3a6172636869766500000000010200000001080001d102650102890102c10102e10102ff010277020600a0724e1809000001070001a03730613039333763663136313063306466363332333864373363323235346163363039623031343565663335333436653034373331656534633166343336643830653031303030303030303030303030643230303030303030303030303030303136336464363832656339373763646461353935333164613366666137323939386136663838333761626164633633366161656463386265313962326437633701a03262306634636561663332353534613665386637306433383662613630343166613664316635346134326430363937663832663436393936396531346336303161313031303030303030303030303030363530313030303030303030303030303136336464363832656339373763646461353935333164613366666137323939386136663838333761626164633633366161656463386265313962326437633701a06137623538633963396133333837653637336464646232306433336632626566336131393239636261653434353338346336656361346361313934646237653263353031303030303030303030303030383930313030303030303030303030303136336464363832656339373763646461353935333164613366666137323939386136663838333761626164633633366161656463386265313962326437633701a03538336531303131363633313133326666383361633364636135393831656335393634626634386434663439366331333537343137653361366539646333333866643031303030303030303030303030633130313030303030303030303030303136336464363832656339373763646461353935333164613366666137323939386136663838333761626164633633366161656463386265313962326437633701a03866363363633930346637643033626131343565366638323039333334353064633332313661306365393537666135613234373139336463323434653063623630303030303030303030303030303030646630313030303030303030303030303136336464363832656339373763646461353935333164613366666137323939386136663838333761626164633633366161656463386265313962326437633701a03832653363626164653363333963323636386534666439303861383662663237376533366637316563326631663465386432636363306666646236363236393133393032303030303030303030303030666430313030303030303030303030303136336464363832656339373763646461353935333164613366666137323939386136663838333761626164633633366161656463386265313962326437633701a035366261663166393130653861316366326264396235313464386333313030633531393731303565383033643462306230636137616664383863643462353764623130323030303030303030303030303735303230303030303030303030303031363364643638326563393737636464613539353331646133666661373239393861366638383337616261646336333661616564633862653139623264376337010800023901021d02022502024002026c02027c0202bd0206007083d05d0601070001a06236616662313139646231396538616266656636303062326431383135653332636238626236366130663566363532396434303931313534653163313330623037363031303030303030303030303030336130313030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03439346533303462643861376261626131343331633065633563383431623162346236333137626232353131663561636531393461343066653534323366646635613032303030303030303030303030316530323030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03732353739376634623939636163373736396362343264646532313434303731346138363362303036363739306431343937386634336138643261653431353436323032303030303030303030303030323630323030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03439383766656363333237663463646266323461343564386162366334323535623930303535623263633730323364386161656538626461633133303466343637643032303030303030303030303030343130323030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03565663938366461323138346133353333636531396163653365613735333138353363393631323765336534663336613638613139393562333162663037363561393032303030303030303030303030366430323030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a06462343733353534326330626539376161653635613464646534353162613761396164653666613438393133303765313336393261633361336632373163356462393032303030303030303030303030376430323030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a034313366633266643236663931333732333233323137366233393031376638643537636234396331643733666530616163303934666139633662343238613930666130323030303030303030303030306265303230303030303030303030303035396130336133313533613939346437323332376534643932343231643365333239316231666131623234306465343462393264376636326563303132386631"};
//MockGettingOutputs::ring_members_mock_map_t mock_ring_members_data;
//ASSERT_TRUE(xmreg::output_data_from_hex(ring_member_data_hex,
//mock_ring_members_data));
//MockGettingOutputs get_outputs(mock_ring_members_data);
//EXPECT_CALL(*cbs_mock, get_output_keys(_,_,_))
//.WillRepeatedly(Invoke(&get_outputs,
//&MockGettingOutputs
//::get_output_keys));
//xmreg::OutputInputIdentification oi {&address, &viewkey, &tx,
//tx_hash, is_tx_coinbase};
//xmreg::TxSearch::known_outputs_t known_outputs;
//ASSERT_TRUE(xmreg::check_and_adjust_path(known_outputs_csv_9wq792k));
//ASSERT_TRUE(xmreg::populate_known_outputs_from_csv(
//known_outputs_csv_9wq792k, known_outputs));
//oi.identify_outputs();
//oi.identify_inputs(known_outputs,
//cbs_mock.get());
//EXPECT_EQ(oi.identified_inputs.size(), 2);
//uint64_t found_input_amounts {0};
//for (auto& in_info: oi.identified_inputs)
//found_input_amounts += in_info.amount;
//EXPECT_EQ(found_input_amounts, 17000000000000ull);
//}
//// stagenet private wallet 56VbjczrFCVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4Z6HAo6
//// viewkey f747f4a4838027c9af80e6364a941b60c538e67e9ea198b6ec452b74c276de06
//// spendkey 509a9761fde8856fc38e79ca705d85f979143524f178f8e2e0eb539fc050e905
//// seed: deftly large tirade gumball android leech sidekick opened iguana voice gels focus poaching itches network espionage much jailed vaults winter oatmeal eleven science siren winter
//string addr_56Vbjcz {"56VbjczrFCVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4Z6HAo6"};
//string viewkey_56Vbjcz {"f747f4a4838027c9af80e6364a941b60c538e67e9ea198b6ec452b74c276de06"};
//// ./xmr2csv --stagenet -b /home/mwo/stagenet/node_01/stagenet/lmdb/ -a 56VbjczrFCVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4Z6HAo6 -v f747f4a4838027c9af80e6364a941b60c538e67e9ea198b6ec452b74c276de06
//string known_outputs_csv_56bCoE {"./res/outputs_stagenet_56Vbjcz.csv"};
//TEST_F(OUTPUTIDENT_TEST, SweepUnmixableTransaction)
//{
//// sweep_unmixable transaction made on v5
//// private stagenet tx_hash af696f9a30fd0d436dfce3d57c6e37647752272769dcc0d194aa20b8a6ae74a6
//string tx_hex {"01000302808095e789c6040100ec2245d2315165ca3a91da51fa002b5507f69b8ee1e555b6f6eaac0ad20fff2202c096b1020100a437de705e6fbfdb6bec4398cdba4dff6bb0c8c6df63c4beb4ae02aac615fe7b0280a094a58d1d01001d503f5cb31e451ebf4ef9b63b8c63cc500acab66d1a9f77518c485ded98f50209808c8d9e02020b448a5786be20d9a00a6755b58731198d7a6c0ed7b95cc34746d7a494a4b106f0a20402cea836e49a83bfe8a49c3bd56abe798fa237f35e8461dd1ce7dcfb8bd5b845dca0c21e024ed38b1a948b8ce0f97a8a678e92c24cec543794c4d3f8802670c2b661cb77f480a0d9e61d02bc39ce2271070ebef256e392e5aaab3c7feb3104dcad5ff882942c1a926da90c808095e789c60402b4b86255abb6c6f8c5c7e30dc08ba0ba7eca238b3444b54c757de554ec8b649580b489130261d5e374d2b305266d7edbb28acf536d78dee151e0e727436cbfdaa9bb8e55398088aca3cf020233aabe91db1381b46c8389dd675188ba9f11da292b5341d324b1b97bc7bffa0280a4e803023bc9a0c13f6f4d36f06bdfcd08194fdd1c08f7e9a4838530780b03678524599b80d0b8e1981a02ac89c9e71c93e6c292bc22185f3de25fc925f37119a4ec8d9980082072f408892101d9b33806437cf186d61b6ff0bd8abdc30b96cfa7999e3d244bc6d0f202a9ee280859aab9dca3fbf3ce304fdcbaedb1e1df2319e9b807c492837579d029f54a0ab551d3aaf6ddbc811d13e4c1abf441c29d2dad28c6b7e14d5bf1345d27a8e40c0c0bf7d21149b9cd1f669985ba99055350eac0233ab0365ef72ed9eca65ec2044d7590c40f7ee365bc70d4f10445219df80cf9066894fa955050b913dc22ff0d5fa6aed1e24b0b3cad8e158d128c102c33df277c1af00cade9b1843de9d01000bd7d3e4221476226f84b54694a895fec3fff83ff567147991303de6bfb2f6301"};
//TX_FROM_HEX(tx_hex);
//ADDR_VIEWKEY_FROM_STRING(addr_56Vbjcz, viewkey_56Vbjcz,
//network_type::STAGENET);
//// the ring members data from the above tx
////
//// this hex is obtained using onion explorer runnign with --enbale-as-hex flag
//// it is hex, serializied representation of of map of key_images
//// with corresponding ring members output_data_t info structure
//// we do this so that we just mack all the calls, instead of
//// accessing real blockchain for this data.
//string ring_member_data_hex {"011673657269616c697a6174696f6e3a3a617263686976650000000001030000000102000003404b4c000001010001a06538343030376337306637623738643732643934326531383734663063393862383261323731656164656437383734353862616334363138643464396366303330303030303030303030303030303030313930633030303030303030303030306330626534666238373762396365353038373731333233626366316662393438343731306565323330323030303663336538636161633665346630326661626601020000050010a5d4e801010001a06636383534363563653565616239663862393163316566656465353961343161306134346161313538343634623630373339383935616633366236346233653230303030303030303030303030303030316331653030303030303030303030306262366637303632636133303664363732613733306532613266323139626462653430633966623366653464363031333639326166393363646232653063643101020000060040e59c301201010001a064316539643262333336303132633736306462316262666236633933326437633338326132663738666566333535303163313463393965653861613835366538303030303030303030303030303030306630303930303030303030303030303030326661333533616138346561386334346338303233303635643739343136303662316661356332363464636366343664633634393465626539363036663230"};
//MockGettingOutputs::ring_members_mock_map_t mock_ring_members_data;
//ASSERT_TRUE(xmreg::output_data_from_hex(ring_member_data_hex,
//mock_ring_members_data));
//MockGettingOutputs get_outputs(mock_ring_members_data);
//EXPECT_CALL(*cbs_mock, get_output_keys(_,_,_))
//.WillRepeatedly(Invoke(&get_outputs,
//&MockGettingOutputs
//::get_output_keys));
//xmreg::OutputInputIdentification oi {&address, &viewkey, &tx,
//tx_hash, is_tx_coinbase};
//xmreg::TxSearch::known_outputs_t known_outputs;
//ASSERT_TRUE(xmreg::check_and_adjust_path(known_outputs_csv_56bCoE));
//ASSERT_TRUE(xmreg::populate_known_outputs_from_csv(
//known_outputs_csv_56bCoE, known_outputs));
//oi.identify_outputs();
//EXPECT_EQ(oi.identified_outputs.size(), 9);
//EXPECT_EQ(oi.get_mixin_no(), 1);
//EXPECT_EQ(oi.total_received, 20998648570000ull);
//EXPECT_FALSE(oi.is_rct);
//EXPECT_EQ(pod_to_hex(oi.identified_outputs[0].pub_key),
//"0b448a5786be20d9a00a6755b58731198d7a6c0ed7b95cc34746d7a494a4b106");
//EXPECT_EQ(pod_to_hex(oi.identified_outputs.back().pub_key),
//"ac89c9e71c93e6c292bc22185f3de25fc925f37119a4ec8d9980082072f40889");
//oi.identify_inputs(known_outputs,
//cbs_mock.get());
//EXPECT_EQ(oi.identified_inputs.size(), 3);
//uint64_t found_input_amounts {0};
//for (auto& in_info: oi.identified_inputs)
//found_input_amounts += in_info.amount;
//EXPECT_EQ(found_input_amounts, 21000005000000ull);
//}
//// ./xmr2csv --stagenet -b /home/mwo/stagenet/node_01/stagenet/lmdb/ -a 56VbjczrFCVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4Z6HAo6 -v f747f4a4838027c9af80e6364a941b60c538e67e9ea198b6ec452b74c276de06
//string known_outputs_csv_2_56bCoE {"./res/outputs_stagenet_2_56Vbjcz.csv"};
//TEST_F(OUTPUTIDENT_TEST, OutgingMixRingctTransaction)
//{
//// rintct txs with mixture of key images (pre- and post-ringct)
//// private stagenet tx_hash 33bb33518ee4a328173a12e9cb37b7fdccee33935653419589dea30e0f54ad72
//string tx_hex {"020011028094ebdc030704314a0f060129e87744d511a9442adecacc0ed57393251a60bb99cffe7a99a7f3681c2aa371e70280d293ad0307050d7803200612e7cea6a2f34794c259fd23cd6e343bd6e82c7a888940f33bf28d52833df52e090280c09e90acbb140700010201010201df726719bf76d6d4d6763a19095de1710bc12409d6bb0a5be3fd6ee3aa29765f0280d0acf30e07ee03f408de01860163ad020cdd17c2b969bc533f8687900ba3e1df05e5d137addd68747708f512a644ec2e9e0280c0fc82aa0207c0041c9c048401950af40624dca383d04176f3f4fac05b1525e10aac499aac034fe5cc98eb2a7b37bf8ab9120280c089a9a2f50f0700020201010101dbaf23996694ec61e8b3159a2284145595aa05d84bde0dd6f98304ec9a17c3250280b09dc2df0107d304ec0bb30267c401ef02ad02d9b9dbea21bbf083b1345b60a2e88d68d43b92bdb2ec061b391ab19de35ca936020007abf301c88f02dd0396108d04b001cc04d875845c042498a05fdbd585b17eb974895a754b32551932b0719c4c79a0bded020007a2b903b031b51cec069a0b8202ec08c3860c7e39306ced8fd9337ad49f0057796d84c87fca1746ff2d1e41712897470280c089a9a2f50f070003010101010196d823627d093a5a6c9850ada8a448480e4decf8ec81137a162bb92e8f792ad90280d0b8e1981a070309140301020446a2c27067de4a7b91c585fa813095bc7105b5570a3d39933021d079c2ea7e5b0280e8eda1ba0107d504c5038502f301ee01940a32442817aac5f26652544cd0835906a94ca3339bd9fd40fa94fe4dde5cbfbc4dff0280c0a8ca9a3a0700010201010101441f1bb37c8dcf54f9e3b5c67d3d88b0885ce74b4cfe585ebe07d4dd63941e5c028080d194b5740705bd059002b001820339d901393205d0fefc8655dae0ebe1de72cdcb17727b1e9aeb16e2baf614f386c417f2028090dfc04a07d204067ae905fc078801be042ff23ff06c18b7fdff369ae16c820478079aff2e52c2b172bbd56828509a55810280c0fc82aa0207d9049f06b1087c8c029601f302169770d5291999984d354eb5bc0ab3de73cc3bfe87a9d1d31cc13561eb539a1f0280e08d84ddcb01079d288212ba0ee670c41eac03c7050646837a39ad973681553cb75c89c5eaf6b658ba46722b4d459d8262fcfb5a7b0200020e907350595bb23b50388459533ab5617672c752bb97d60454d077d4df9bdcc60002586c51fcfe54f68fda156dd8b947f9e2e661a5d66f05d905a4392fc271b903a92101f3338290d33f3c9cee99203dfb6441ff71fadcfef90646db7dfc250b12e2774602e0fa89b261144441d52471375d5b6fa20bb4657968fa138f0518c8b7b259519fbe4906ea03f509ac2c3da0aa9ca2e23b376bedea8fa8139f8636f1744bb1aabe52c95480a0a33547e6f546be1f3814a2686f3e557231b568096ddb56f0dd4c7e439c0f8976fcc8baa0211dfbd22dd4e5025396b41266b5b15a97fecc75b088124a37ca3350d001a9ae71f96a4f4e204642c92967455403919541186077c85da1c5143f06d551070998ce959544f84ee00ed1f5333b235ff432625f6536f02509462c5c939b62d13522a6d36031935015f92bae5eabae277dfdb22971552f3964b8430b2cdaeaed13cfea9d50a3877aea4d3c5683a65691c82c09879a3102a3349048175be9857f15991126a7ff5a90e3c10f246bc10cf29861702417d4ef83c080621c40f47520f86f58643603293409c80ee891cbd1918436f2633ae71373682516a22513893690f2a108cbd68587ae209e1094612da7739737c0e5f4ac89026de5d97ae2332c4fab46fb2b1cee80eac46a4921a2129821e0e22663ea2e961381acff30021cc08d9b951fb29add0069445630341dcc4f220c0bcfaba36bc843a4502f32aa2128b2c44fe3f8fc968a0a487a7e7044d62f5623d610075dafd28b6b51cb6803591d424cb47d8f6c4b5fe4fa2b1d72393f47ff80f17f35f5495cc5e18449e1d7e637cde9d142baa893f9e8c919662aeb4a148dc39ba64c0b4f9e1a0b122873ddb52d12b144c12dca4cdaa776213449c32c15cbf820262b4ab5e21695b729b49fb29988cb3eb1d57132f0f85b5f838a877c0bf74c698aa3908fb331266062f70fc141ab940aa8d5c917e5d3fe06ef727908e03aaae87cb802d3c05b2fc4de7003bdabd4d8a01ace48f50631da273cb264a003e18bc784d89450a294ee3fc0960c7c89ac2f28170ae19b4f8ce08d91ddbe7b612d12aba3ab2fd214a63371a4400180ebb8b00206e3a268f32718e8eefd5505d7240b5fecca0dfd29f21caf9c11511136ed9576af0b44572f7c1abe14933cd6ea795dea3d26363a2af9c7294995afbd678fbd6f21ca853084594e31e38f957c639f3774ca0098ae0c03f393ffd10068845dabca6b38092e7a1320ce9e5bdca0cf9699c0f2f8f966f7f38927deb609e8891ab2d8006a7bbfd158d4da3abea0c9e9641457b3d3dbcfccec615c70500e8c944d0f79fa63cc3378ac458b313ff74f3697b8e67f9465726693e1f7e6db04e5c0ccd2bc5fb0388f4f404820b23e990323f11366ed30e724b1583960d3120104fe63e01ba2d8b27f1cd6fec494d9c5f42e18431444f8bf0a9c2c3478e11a0b585138ba13b36daab845a342a3f9eb4921180a21ac35bbaff02ff273dac4d4070f8e6c8bbf7f60679151823a483993184ec7034d79165085d513e7114687ab0476f20dc8bbef4ae0d5b5c1a385da1aa7cb2638516d53e0e20be30a9d6568120e1c85929fb798e9883a5f61897ffacd6cc7a8d22fac82adefe00ce8185e3259069ae0bf4b9f79c41e34f387d214e634c0e95c7252e7c933041c5c24af31c94502e14b590de38641573283c6eec64c25595aa8a4b1fdb1479c48facd64e327750394e751124863625bde1c6ebe128d6f0f629107da69bb4dd7b265ebaa1e42030066fcf266840e881a1dc6b671536fe9daa95e212a197e6045923ab725b675240f29e47ca3e571e68a7d3dd34ea3319cb6969ff45fea577303201bc08b55e4d90c762bc4207921465b5293641f75c35ae06e1390f20bc6c6a8f38b7dd9fceb3c0ae5359aa4b1c99cfbb4a7b2aa5299ee4c716da43238657c27b37cce0da988cd055706ebee70cb7786ce63311ddabb11d85800eb9b66d6259aaa34918d06aee109d480ba455879fabaca7c729e5fa7fb5d88b817fe075fbdbfbf6daca28445180b7d9075d533153ef808fc27498b5a47347c378e98a794573a25fd7688f43b5107c52c77b5cb607a1279a041c6b6630d24e64964477873841d901d8842cd3ead0e811af232a6ddd338e6c3ee41c3f35456baed91748b638cf9fb7f952a8ff1150d8f00fc6906e9efc0df05dba6c41d33f62d99b6ce7cdefa0676a8af00f9bb910bdca97680ff886b30cd893a26f2f84f730cdf652b9d795fc044201f8b7da51d04934d5de2ac36fd77e25b06d53ecaf63cf6c9b5068fdaed54f3ff4f60ca8b850e5023949ecb2ce1429e38ff2a54af0d7c645bb2f500a14e4e1d50bcb73d21d100c6254f7a1bd09003dc4be5a81bbc272a7338eaba5668e33d1346f1e7fbe05d00a1587e5a0e2604559698d2e95d98b95398a4a69e307f3ac89ac845579e931a0e5a25d2c2afbea1b4702783bf34df796c03565ff813e1f4483780499931026d098cb3981c2fc42652b9a27ec2837d822979af6cb4c3e7e62e3dd8b1d6e899fe00ad8d04932435d4673bd005150e3b471b0a400400adf37a07aef2f2c4bb263d0b7cd5c17fd3e0eeb90148288a715e1e89a77df25fa0d5a121f79bc3f0df0542012bae2344fcfa9cff7dabd16db391c5a4be01ac526c5ff9dd0f3d7d79972df30e69f5cd3ba87384143cbc48dc2360a47edd5f74dc61d826215aff8d5db2c5ea0614c21ff3154a028bcb733458f066856f7db42bf774a98c8f2e1aba05a0b55b0b957c3c3d68998d67bbaeb979a1c44b1b2b4e1631be2b8055ce12e7ba0c6a500ca786eb8dd9bea11d40fb3ecbf54b6472a47b276a1b75fbce9da5ad73abc1280015a5b3d3844175c21f746921686a568e655fa98d9f97b09e110e464f972e46027580e63139e2a9f0d2aa87607f2b699d8efd1b3247dc5e7e3f8d92d2240fd70d3d1a4ead9ab3b53aca897123d98a100ae02ddfe247ebcdedec736ca4531afb05324487ca52573a0cbac820a91e955209146a9b76a346a74cf255d9809ae945036074fabcf9df30044b1078f2cc34b0803e680fda713899244fcf896b77cefe053a40ac3353d68d13cdaf3fec2eed90d5efb4f32094f38337193b3822489da80569194d7ba635ac1fc1780a3a2722a4c48f35ab75905b6342c0209ff9f41ff40b707caf53520192e9e694f8ea67aa321130cac58c03e5c12a6e267aa357f2350ff3c15f5a8df1f127cf90357d93577858e2789e9f7a96a2b0abc08d46e7faec02bf5680dfc430fd5da3363120285b300232316b3e5c2ab9f2dc145497d8b2780c6d4730020b8b90cad36e822bf0063da46b3e74bf32506df4a9e682c878daca087d29256499c77410719b58ff8d3055c39d0138ccb9de4a07c256e7e9d263b00c84b32303f829d77b281d54f3d25d6854ee418ddcbdd18d01fe8d4f055bc45600f7d2aeb3a702e6e58e57ba09335248c853b3fecd2b814d6ddecaaaf6923f4a0f9425d14be16eeb90dddbd3b2d77aec882d3ec92d9e2b77b8948db6480cff690753a162a0d8896538010276b998519f2cb6fde1e347c8b644a7f5eb0a38f4a60d97af0f901433008cf35a6e5dd57f7a25d34584f395858706be95cf1d186d0a07e8e2308dd3a0099cdc82da858ac155d05cabc527f641a0768d143dc878afe507742e6bd6ec634d2a643480dda1363919b846723e31494ca7ea8f3bc53c6e860a10f355d559b0e25c53beb2c86752ad9f6c109b13b4d2fea48b7ffca7f4c3fa02cd55bae030d032a7f6fd54d5539d1754d96b7c3fc0129ca56676e0ec98235c075ce59c82e76f21ccdaf6177064f7e621f96788abe903e15129e43c44fdbc5f00dc647cc8aa30726afa5b6b76d68b4e1961d29455fc981bd618d5123bac17e20e6841a42c4fc76e1b2e2cade43d7de7a6c324171472af6520b5270ffc7d76f303123b4885ac9a5b899e6177d9982a3113df2d513fce3761291f744f430abc5f09a0fea962a9d4d101e5a88823569617598f4f9bf20b8bb2eccf1b42106e87ce00d2ffd8ed7d5380f4de520bb3ac57b7983fc793e8cbba4ac33c3d033cc7b228006b31d8a22474e6335d13f437da60cb5b9bd33b783391d0eb544f1133ab3d020be3bc80dc28a49d8cd326d51d7ec0b6a85a97fc720260f8f3065b33043d2b38088cf90389913e4a47a172e5ef7e1865f07ccaa1cf9e9f3ebb04bc2912d3b2f9010d135726dc6953fb7ff86d56fd04564b7e0f81f028ede06010a63bb34cce900b617aa8d042413c62de5fc0d084aa4b096f38ac7a421aa85a4fd52f7e143eb30d3ccf0f571cb954135668fc580654d4dd4a1488e19eaef0c0835588aa03da8802a709daa2d7fc469261acb88233c5398e186ca7bf2294c48c14af6f6fb39d770262a5b0aaf79b63841976199445166a4f263d602f78647a7da9ad9d36879e680661ffd55cb3ffa7abaad8978e5af8b789ab1ebd65c75481da5df1d62bb6d1530907e8e8cc2605872b48942a9a77dc89ab55261fdd7631735705d651cafe053b09065e8122cd4ec623c95ee78ac7cf538368a14d7b98192bb13d78d523a071f30dfc0bb9420ed825ee18858745cc64bfc61e48c601687b915f3c3c1f6769aa400f5863f86dd7ef3e25b6edddb0792a6a34e7b3f8b0e787ee7e6a45200377dbf001df910c16e7892856ce70403605ebf63c6fcfb758cab75c1c563db8a451f1ed0d052843814f6056ad04bc60fe8af6e2cac8a10599161d114fe560b538627d3a079d40617fce0aa25e00e9cd2c363a385e4817e7bbf9e456301a9bc8d99751060e502f476b2f6045a648d9a4cfede95604085bdb45676ab3b0700cd5603fade8090d24dcef78dceba6a7bbc8076c595b463f8748acf792761f05a68a542bb4d30f1f9bb9a49242cf5645141c5239a8a0327fd9323bb33fbbe9e8b6a507c166840e57a17997c089a7106305fbf9a9d07d9c551082734bb346626ad213805162940732a8bf9efb90dd25f5288956ce8dfa3318f53d2fe2ab9fc13140e77039f88400797aa0e9cdad12e4664a62ad7ebc0202c119b61522d106004cb709bb678d440234fc82bf8a3102cc9f9735791b6f5833c3924a294d2cf59ce04576e83c3ccf0f405543d2aa29fc5736eb68ff96bc462d5255ff8d0d1cc638cf62469424476f0232e9f70a80e82b34bd79ceecac0230c5a90bac7aff6bc5357f5a7e2aadb8b10176334a3fb64dba1864493717a9429a63b09cf5ff79e861182e0598c62aeacb0c5a14ab04f59bd51c54534e345d0c86c8bfd7c68184099af50cada445c34d9f01b4d87ca0d624311ac195c343a2cd8d04f601ecbef84b0a1bfce4eeb65c2ce3032077101c0905a385780e3a4083eacad62a6e24a9cba1b7a7e4396f353984d6076d4148d6268a334d2298e0295e09797235418e4f201e1e9877b7920cbec0880362b9d7077d8b07869c1f41a609a8da44def977316d8554864a9cea135423d005f3d143e927d3d3aeb0dcb7c76dcd71a28f303c008a44977d0601d870fee6d40a7ea86364d4eaae61d8c70ef0caa3d2737a3b1bd1542ec2ad6af37c6f3f46550d676f66c5237943bef5dfcf49cbfc4798f15dfcc490b3877eafbc2fa62cc4d20dadc058894682c2f42e2ddff62090542ce7c86f3169d86a480357e8ec39d21e08db373cc2934f3c133d89f3ae034b8bbf81eb56d5965170ba5c46f1e9f684100b28198bf2f9c282ecd973c4d180ba99221ab4abbb80ca0777cbc642bd5d0912017fbb1084ba0ce8adcb4287c7017b2eb5eb4205fec3e8f181d65b6f307f149c0a0919515771020d674a1566e1301b1020d0044cd2e3a94de118bb81e38af6640f40ded32d697abcd7e774c0fec5d50226d5b9e26d08f129470973b362d5b8a703d97b09c4ddc2936e548d54238f27ef8cf98bebb4a16c6847d2484c01ba0c6e0f2471408180308570da88c4b94361a7291364e8280cbefff05e47009d8745ec04c81389a14cd56ee27abb39616f035e85b59117df0e8aa64ac0c3e74614c5220774c5bbcb4da1c48f4648657e96d9e16d09b9c382d06a98ec21ded323e405ad08cba8cf3146aa3ccad3cd52f90ee80a3c92cc65d3339ab1a93dde1e858efe450ba7b015c1d9e9ff39c60f97d240c9264e754385de7836023a9defa9714e163e040a3dd2da8900fc9375113e076ec1a418898587f0258e76d40ac735a5ad86710f54b4b0700a2846cc1e69a76ae47d04c208097c88e10c23ee6c3fb91be78b880a13fe3f1a8fb23bfc8e91c785d51798afc44ab07342045a986a827808b924400da51a15222fb7088c3caa5391810c7a3ff3273deb75560bd65bacb59e3a584308a3aa7bd46bb324b96df6f762a4b732332586c54ed5051f9826f1c3c22a42f4025c7fbf2abda24b0023f20d6956422f0a0b5e3805559e9c79a67262f4ef7d970096026e3045ba1c755a7a3d9e1b2ee086286a4164dab44f481d844a45ede5b9048aec41327e1db7ecaf9cafc714fe05a73cc669b45d5b5a02b9a0ff4581f3ad0220abf8ec24484931aa55238985da0255dfd0e4e9c5abb06b53e9b12f005b5f07fcc8ae36d0594787e73c4762907534ba5157baffae1e3e28630185dcb211070545954386bc8452a42ee884faa52043b6966462972249d124daeb43c31db1e508f768671cc4ca3dc9c297941c02e54049979f55954611b88e13f80c8fb727dc0aa6a5f8f13dedcad36d15ca47bf31f9be01454162b99def536ebd718c92830a0c329aedbaf03d843f624c64b8f3c1dd54dd57283bb37fae65eff2265ed6de3d099ed693f69c1717f1640ac6294561af1bd628ea55b8e7c658c0b9e33b0b1968085c4e2e7a093641f80c14bea84f8d2ce4ce8a04152b00e1c8e77a2d388a1b6701bb47794c12ab5bc29cd3640cb8249d0abb89867e106884e993a0e6c0006f930a3661336902c9a8f6fd66f4e5999e33efd32c7c136e11eed9687f628ceabb350801bc81e4125d62f61f91c3ae699451a17170599b9557e39937983fd60e04e50f0dff18db5a440becadbd4ae841eaa6f12225aba48e3c795337b6e549d7b9fd1d7f454eae988dbcbe9d68e005a1cce70a5b4a943022bde50d60a7dc7cef58a40c5119a3858bbd1b905999ebd930af9405864a989c38e7d4d305dac7a56bcd33a2e3e12d2a91e987891aefac0c34a877a79df42b2ee7284256e13d933fc0c85c1e9f5e59d6f7aac2ed82778444572e66700ccf0d698c27edb280d33cd4db5839d87a356dc1e75ca37e0c2d4345368ffd471053bf76f82eb9d605250e88db307b5f546e500f2cb3daeaa292c4d55e746628f8d7d0f0e66bed7b132529c773bbf438348a89cd7c7e9dc0e3262feb7ef4966f632173025b4adc1c74723cbe67cde25abee96478221bedbb0e1c87affcd60755c2b62df5de8bae57a1d733ec9e991a25d2f8c0f60f48b7156d156cf5972a3472da274cd9cd4a7758414b51d19e8c91346b9a1eecd9f81aa14150b7e09f67d61885bf732dff609ef245e94a4a66e34c91fdc88b2262e17a1761e1bc478657cad09fe8621b0a94367dc316843f6b79b8f6364a124117dfbbf9793097007facd3f433f88842a434933d42ac5131872e37d67229903cd4b58b77d29046ccd2fa92881fcdfd2ba933cf0eae8b8b07972546802b150ff3e0e7a2e5422a4ffb2e4531e112d95df8ed28029e9ddd38874cc545a4042f6a4efbe809fca499d0fc974e51568fc66e65d9d0875ab1be983ac8981ec56461880e7582dddadccc76eb50133cac910e23ca3abe4a4c28eef415d4b7e653a22b28598766ac6b979b874bd78488057471731fca505358b8c8df0d536d2638bc55b86e02a518952f92ab9fabd3c2eb3cf141b1a0dabe760bdf4e174be4c62e2cd7092941e646fb148b572305af0e21b8c50c3d3cc5d81f3c64613b474fd26ce82a3fa5ed8bafaa9b718fb46bb4dd1a1673d0f1d9e4271921e81a119e3c0ef48e08f441282f34714f47bb6835070eac5517b2c8be6fc321453b2e33c9c8f60a9c10c46c7442319ad5e6c88704d79bf9ce12808b946f02810ed7c1fa8636b425abc71ff1407d5b6a9bbb2b350efc87630116b8610a43a23bd79c9b5ed2da2551120f52893ed9c8155efe4cff751c3845535fd8f7c37c263687caa001f90ff0127e8fece76d923e13cfe7bc4889f6801a3e3a5218afbc289d0fcbecbc31c8505454c542787d79b3a571cfc66949e2b5096b8f7b646f9bd326dd8be1f4528f50e8f1e499445a8a2c1d9e2c5c866f7c108328556e197c17c13b242382f5cd23d9fb2ed50b009b2b73009d64a3d6a0a7b8eeb1858d622da5def29a8d99f35000810ebbd06b51eb2223b1b3047406897b1866fa2e20c7f51028d143f3fcd36ed946c06e7484d0c4c846c5451f9fb3f6dc4b4f2707b2381e84f4d2655d0e02fd0b4afcb3dbf24a1246906260a92f8fe0f9ead11bb64641c692ff554a032105639834d3ac14da586f39cf617c77f6e422ef0c29099a3d9ccdf04c391f6ca2f1e0091d08230e9106db8a25efecdd792e09e6584497a7e643353853c8b3183861791d17e1046f070d5385086c3510f6879e272ce0dc1363507291148f00c7d20104487ae85fed1cce9da145b75a921dd9734ef4ccb27dd2941829fe8abef9f97db658db36c8a1d3a5bea3cb84bf4882fd874123d96fadaa9d5388c990f6dbe7492d26ffd2862ca17edce11ca46072b049fec609031826a69a01e0523dc6af280c661c48dd8ccdd385f944212110f2c838e485f2276f44c1d9c1229b01fd4957f30eda129978add04f938a1990e542da0bc3b469d7b85d3fedd7c62bf26e4aa4704776e79c22eb906a530bfb7e4e1d2f5f28b477bed36ea585da25e21f4e42c80cf7aebc03780d0b8560da2b2b85def1e4cfb332fcfecf5da35ebe454abf4c287c51268af72c373b46fbc294495b3fd7f882d4c70d521bcdcbd8265c068b234ec6c0960621c81d685c78d86a14c4371b6404caf0c0fbb1c0b4394d063eeaa57878af8fb2b75e55cf59a7db98376bf14ab6c3fe3f425cedb02090678792cefeaffbdc2707c4c40f952b07044ec4f5be1beea0b1d63e907cadd61b64a3a4c9d68fc84948ee6350a3f06f8e37169a389ffc8dcf43cfd1eaf2e568ad2348e74a9959e4637d2887c6d8f579163017b9acd36a8a348aa82c2ac85e86d289953ebefa68f587f08263fa20adc72ae6b03f531e669a177d876bdadffeab5a1f33382dc2bd61fb0a63165ae0d7a2278c58eebf4e6e06bb7b80e3967775d0a4855637913518145a27c18b964eea347ebd29b261c2e4e71c8e91fdfad8621f0c257aaeec6e15e52a26b256f6c1259f8c4a972804d7405dbc94946581415d66219a11f5a8bacaf8b0fdf90b1e3e163b720a042d48d777343573b7fbfc1ecbae6a888f39f5724a0a63a3bf4a489833f2c54a1c3ff8b0a330ce40fd77620c37ee8dbe74f1a822cc7db1a60287c92c8b635c42c6867f633d943e336efb556442f0fad94f159f06498268fd6237180cdab8fc09fee27e9520df97528e0433112d72402ee25d30f394cfdba75cb7d23985b33e23fa425230b47eae7f443dafc7c629d07e9fa167c9144154a5a15723b7abbe94ce5fbceaa018e48fc83c7a02099e18bd147a52521fd9a590b034414e5cc46edf4234325c0b620095fe20b2819ce7e649470a9335231df1ecb52c79366a92f520f6679b1013e09c3520f5c5270b18345d0f6fb24eb25b9c351841767515beebf89d754a2a995cb369e58f20cbf089fb9cfaea1dd6fa9fefc64af1ea86abb871c873a55fff1211aacfdd1c6097d648c4edac7c27f398b0595c1a3dc4a26f1dabb37f5faf2c54b7281596f85222b06ba954c70a587ccc9b6c4fc182234ee11211e66529df9b1e76d792e3b91ffe900bba3096d6d2cfc4628042ab25967eb62626c0c8876cc29a4900f98f0cde6b83c8e9ad2b53e4c458f58f37d36d092ae5fd642dd687245d0827ba24176bc6e47512ebf11124b1cb474b461cc41d0fd22b16bd16f987bdd249e017c03bc63d5d3f5c92e1ae763e2398573884e8ee0bd69d0b563752b5a26bdbf4a4701379b4e379466b69bd6fd551008d4b3705220e90b6b154a46594db1e844b79939b5efe77a4d151314debffe564d084cb92fc02e0ccb619d98d0c4449fc1a8664bb6ac2258ddfdabc0527598b6ff135ef0aa30a359c051863d3f17e38782a1ff4785a255233f31d24a869624be0b3f51965920dfb174a562a37fca65e50093426291f97fbd84c68309455baace6ad50dbdbeb0c686193a71f789ceed87aab46104cd219d8b4d2b8130ea54d7815c1ed3752c0065808b2d8a4d7f8dfbe1888555414459a0c8014381a05682cb9aa6d97e1109c0dd4457aad820a8ec9aa4f2147107376b06f0df25b98f918e7e4ad02868553ee0a16e98a6a509a643dd1a14a92defd5f1cb89f7c3ba55cf31dbf6d60dced23310166bef0e851f9a0b4ed591207d35d726f4d7d35e68aa316c2e57dd74c12ea40054b78fcecd7a666ebc82aca9996c03b4dcf1990e71dc257fe5855dee5fa87420bb9042ffdb6a2055f9707fb509212eb286df7cabda179c937c5d1f0110babf20a9c82b8f1e32be4f8fb45939dd65c5714f6fe68169fb3615a1727f60279ee790843810d25e71d4c8646ab3a739c1f8d8caefe83914af082e9706aab591255130dd0b1396792d32312c39c3c4272c7d5906b7eae43e0d328512df73a81841c010dff41d1231f2894d08c4c9a0f4d9f9c2ca80aa8734e9cdbcfeb1bf495fff718072e9d0b8f014105f196a561322e0e7bf69c0234ea7027cdfcbbd5b8a9b9bbd600700a1c1128154607e556a47cec272897b47957e809ec33eda2be6e23841ae600ddf34cee5c2f2fe59c533f2b463a48dd138ddd3c2ea91e044f517cdc962f2a046daed010f16dd5c9b662dce4ce939121aee37162633309527354be1b37d2a800cbd7969a5eb9f183ab80b3ce111728837895210de4e90049a6e56290c68c9700acabcee68ff2ed187dab66c6754970ab945de1f9b4c12be7ac3a5ce49896cf0749dcea48e3396821fd6a4fed440a03d85f55eb1835c40dd55741274c4e18dc0ea0fd17627d54e1104c53daf6d74c487fb4812a4e439fbd2d013ce75a6b3094043a4d650a311e521441b24f7c838a35956cd412b33c93df117c14b1212330b101e46ddd771045079352f171e94c77d72cda0f91540e50ffd579194a3da11f3e0036798c76291ee5b88f0cffae44bf96232f21943027b361e0cf65c3b3c2c5dd08492d0f04a530aa0b268302ccd01a0d2e1053218e13334f6a26fc872e9a7b62086c7852f7f1086dd18b997c86e0d326b45e2378386c642d7af55e27ef099035038dc369fb3794a22cd690f060036ab9fe4c29ceb40bfddce7d2dc8e528789c20ff3931c28de28ce004f74315a19e17d7215d5d21a374c0d10161fabe3197a6b00c65352899afbae21dd7c46dd2532b6a89be6e26984c55983c0cf7fbd4e843e0962310d75625bbd634e722ecb4123b4b7b6694b81230472e6c0e42aa09160b808a53a1e0462348bdc6e0f053d4f0a66fdc8793b87573e1fb18682043eab12ea035dc6262d1d2930521906204ccda3471116f9b7bf0f1396e90277181eeac8e40e90e3e4a7a1dd3b27f77719e8ad6a73c65c7d55ebde520743c4afd5c86be6630d5c9b165eb3c9f2ff725c2e331b4ba29a586c9beeb345098acf77a15cb2b7fb0c76021529b2ffcf7ac7b899b2aa1ca56034996135163d332b91cbee53cf574d009d4c5088e27040132530da5548c27dfe74c9f087cff25bfdf4584235765dfe0b194c542e5d92d71e423e31e32a47fff8ee7eecdf5281c531715c0c64bef50303f46e5c6b79d84d23f9b9b628227e9f3db9cfef4ff796adc1e43f0c8181575103be69aefb3a0401ad9758908063da6cc63f355aa08b4081433d752f50e9d904091c43a20d5b44fea0bb9f50bca6424f2f6c2482c180dabf927bf9525c9da9ea06d3c71c72c8d49cca2bcc6a0e22f74a9970b44fd376610800a2cfcae2572fff02f3309b27a3b25e46beab327854023e44f776f4b201a0ac4b10f12e53b700610a51a9223a2c8460827488d43ac5c787a7e6b4691e91306642d097544110188d0b5bf6ea9f490ff876f647af3010ab31ae9c8203ac1b6612d24db10dc446ef0f077ea5257a0dd1c13d165769be1743d81a1c6a587842c5c7b4163ded35af33e40aa0c8bbfffa8ae49191323b411c384e58484f05740ab8a952698e7dece7b50f019eba60d16eb9da9614368dfc60ea34dd6c8cb65df197bb5ac55d6a9ecd720a039d8887ce07e84c2e114b757b823a291a3eb1b0e4454cd46bcbff705916556f0c4190d9709a9bf8aeb9ae806748835c76567de0d5356d360cb71bb5c8e93fd60d1f56f124f3cbb821d4f336daa402bd3388afa7be835f82dbb32dffec16d5300fd8e83daa6dcfd3d98f05432806c676fb7ccd7920f1839b33ebf40004b919ec0eaf76caaffee58b830fb0fb74d760067128f34d5d26968919a5d09e646079fd0386aefa1d017689cf87a967bda34547350d9dc02b1be413932e3dedff42531800c8182f4226cef88b5f85572b765b56ba85ca686d015ea4445acfc0e045579f034574572aa65487c7645e3a732645b32c1c934c2b3a1b97294210c592e58f270eac56da4c89745836250cb72ba58cc6aa64ae65fc4ad38d8eed63bc4e214745067a464aafd2caacb0bf0230a33949f9d2b6e6c0be0ee7e9c8f3a9cddb5321160df4a3a1f58ed19dfa4a42db8f0a367cf5ad1c8cc2f2f6ce33b34cc0fa4c505606f2a6d6144b476fc853b97a827a1f92667fa42bbcc8f974218ebf717f705bd7086c65a74b7eb81349bd38f0b742e2feda72bef53d241b827d168816aa84188d0ffa92c9cd22dbd62bae3db1eca4d1b17dc8aeb8bc7335c5b39f79b16debb8bf0d06f61bb69aaeed6b52322165bc0cb8f4d37e18bfb4578e135989938d72aeaa05ab0c624f5c27ecd6a15361baf71dc71d5665d092f8da4cf9eac226dc224a1e0db63ad50f6d1ea87cc4f6625d9763634a15bcc51abc946c419f3a87d5bbff930898b61f8f8a3e77896c0bcd18611bebdde7061e26d195a364182a2d6530f6370ceed88d612163ae8079fd8962d3fbedf752cd7eede36e668f71fc988ac0ce96085c99abc1caacfe81b60c7b06f80b023de2053e88f4558a461f0177322363f70c24f8784ac89b646584e609ffe462522648c9a9c6942b77648826922ba585cc0643573074e511fe4e0b01ee437afc17700b73f5141eb2e022241292517e6215021a767fe8970b39c835677a05e9b6b06c0fb54c43bb75513bfde1d8108cbff30059f70ee3c2376225af98969439110416d493856b6bc6fce476ff4342338f8004ddfa45855c11353530e9adcc434e146d8ed13b976ed8c4ce71c2e2831ba3c30a10ba645892e03883a29575fe61bce6fecc106e297d11b74413eb6df527930d01fbbc6f639a3766d53443d7efc8006cc04cdfdf80cf559fe044c009fd341de505e80104dbc6315f3e9b5d0d5ee3b47c00cced5083d7f872ff9bde4d8ec47cc409c7036bb18be6c8cc1c637277f7ffce7bda4440f47b4e732857033fd0bc56f506d9711ddce1f041d44fa7465a4177a6f51364987f5d5a3dbff09fea327c3e2d02e7e9f7b4527a874a983a0be993fccb1434bb463cf200119b3e7480de8bec280c511875a4d891a65cb1efa12306afc9624b9697f61dcf0e6c5bb175afe489370363e380bd134562a3b16ddcd06daf7f1739c1771ab5314ccf052dafd11bbb68014efcf4c3f38940dc81ad8060d5668369179476ac855b03916184ec69bba799002c2775a67a4cc276e9518d7ba0e0369dafb4f26a9e278f0735a5f04e8d39580644f6d7f30b4d2afccaffe542d134de0a401620fe49f81c892a84a2e0631da408cdd70d912935560c41f770deb6a1b68c6122f972b7fd45a2c4f8e32770dc4d016ad47f69d833201eafb7a9875cc1b670e43a289b4df44fffb48cfd7d23a5690b36bc22aa6aaac2d2cafc95c453f1cf4e8896f44ca0bee532923ba295a4e7a40c619c7678ec078fa2c421de63451d9948b8045702ee4863469db45ec2ec5d7b0602ab82800bbf9d659df1c52dd70d5093e3aaa1c2d7ca221a4e44537a2157ee03cc22295017da266217944852d298fa61e1ac5491fac806f3ff7683c38594920abcfca008ad8e5edfd55bd9165d7312d0cb60cd31564e67c31a887041405c050abc38159e05c6507611228383b6eab2f35429566a779060654e2d7654f69aa20d71d79b97119c99b822e2b19fc421f04081116ea7d8496afb75be96cba7a4b10e29d064ce62da6f694d7bd11725d64a4e0b00de3e57492fc595a272701e58190fea86aeeee467a35a6aa450c6bbaecc3588fd02b70186008b3db2259bfbecf20c3931f6709a7adcbcd7ec523cea110e5d35e57d04b973b753ffe4ded34ad1ed03aa2b84fa66c4ea647cf0d63be5628d861b578ac0d96ec2886a5916f9400d5004cde4518e05ee609a200ba8a744a290cf7f77abb309f9fbe79f4172ec84e0670d12e5709e2bcaa0f47851c59e6a279f363f0c3366ff06cb47295ff387408912020f52c464003419d785393a9fc1f60fcec598a645606e7ce11806a65b45d4ee083ef143e1b58dd4010486f5d578a7fb622da4a9ef16eae08cbbd260da53e5b10e9da6b4f9877ca030e6a094e2f41146bb7f40b31252133cbb212223ca9675d801f4f60a30320a21b1db80307896c77c87201d55c865ef358d5339137dc1e04f07bdcb6f8c96b1c78d1d475cbfdbe37d35f9f132d8241e001c5f6cda0777a3950139444dcbb57f812a1992112b41542ed1e2516653d29c0de9a97411fbfab8f00b43a4e8609a40e8ec351ae3ea8e711d12d76bd7c380b6fefd6d3dc3960e4cd90bef98b6dc266ba391e65da8492b5a079561623a4f9b984971f66f25fc4df3f404054e089dc63b527445f620068cd62bc926bcfd88cf2fb32bfd72e131ddfc59038723b212003e2d0cb05568ea14666838e11e2f071168c153504c2688ee7fa0033ef71dcb63b97b60fe79a3eeb60982cc3b29d1e8b371556019983cb3cafc710c5c0e28676771a724b3ffd0acfe1af9dc100ac74bd257e4922b86596a9afb8d0ba626b8c91ad0bcd0d41e5027122260ba883c706c322a66d74193e6c9602e890386152cc12694a860f438664299c092b3ee7b621e9f8784eab1049251250b330f837d6fa0f2db89107027ce58f0178031f439075da1db3b5dc4717f317c09c30068fd2e87ad0d04ae6ed83a1d2c3725336851bf1fdef627120a0a80d8e27da3030f06e02dd461871640ba007d5d87cc3497fc93831b65f397e8ebd8a480ef1a098e2e4d53f34216411b363f5c4086ac0ccb987f86ea7d4bccc9e51c1e8451c20cff466307b5634d758082c721968c93a2a61dfa46e32ded6f5dd71f9264bad10f7565fad893e6ffbcf56edc9df4f71a0b4a39e4ac8b6ce0a8bbe1d4ea206f6b0f82f60f7a5c849edf9cc016a3d49f1b5bd53bab45ddb261e2929a03b5c83ddb0be51794e327cddbd344e800927ef5a69739c6d27299e54d4f5f2113e4e27a000f2d2421e375fd5b2d47e17ae50f1a47b433261e718d0f039b79f2a9110aafd003915b8f2849fe2d166f2aad027c301d6dcd1a3e8f7ae0de65c99a393ee544dc0e5ee8bdf12dce63ba42eee6a6e40b1d6d14ed46a80fdd0d87ab82b5aaf092070d279d2569d584c67de3ed9041870e7d535e729f03834afe5a85b837bee501b7aee6884941ef9873b5fb79dbef84def1ba2a5c286f1aaaea7c74a6dd1b2fde074ecdc20222ee12ff9c1f60e74cbb94ef3da6b300412687970db60a0c0c5845f5e8b6c11d91c42ed92c2f802d524eabc53019fdadffa2ee197641edf7b95f2262a9d0cdd8b7ae917727acfe53041dc2a6799108a6ae6e09b75c903ceb6ebfaabe2e67e0ed994e9717f5cd56c157c041d75056822d55cd71c106d390a8865124371f2fd86f6b2747dcf8575222b33b483e5350bc96e3bc73307ecf545529b1fa96e085673c9fd354593fb4ca3b7d9153af15453b5e9131e7a96cdac8ae128c5fd4f0703fac1d97994daf6f76474c6ca8882cfa18818186b25f81ae77080f8eead33786937a4a266790b0b82a3352ba9607abe3456835139ee9a573e457102c64c9a6fb9cf8968399b589c4da103aeed9cfba70a334b61027c1f0de0daf2f4aabbbeec9260401c398f18ea1fba4d5a0271edb08818fc6e72335fb4cda3c8305013f9acca09e4f97b1557d044138386e0db5a641214676523ef208f968515dd9a6d23ad60fc6e03356f338f14a0645f462799ec89f2bbba4ccc08501053d9dffbf55ee8e9dfee3bdc696ac5dbcddb8980f875573fff58a6c786bf95645e44a9c28f53b2c4ec8903bbc61355f28c49d3c7e198379b216ef8179eb8b5f306e96000926c71682abb028cfb4556f6eb5f10457cb684f340bff92847241e8a41f066c5b83e453454fddefa89b2cda2a6ab8c9dc0393e9b8ad3eedb8e801d313ac946651fdf0d9c108042e0e64610000bcee5339cf42da7e3bbb7095baa4a6605c470d8cab2e5ff28601464ebeb62ffa94eb413d77c4901edfe8de8a44a842b5f174c31a611edfb47714c9053fbb191007384afbea0f2e001e478ec3e91c0b86866704992a55e06183d04b1af1b74329377bbd91994709c20ac55dd71ae9e1049eac70f4bf3809c1b14e905fb1325eab491029874f16c3ab6b4b2265f983e0adb7a72d6b8e4b75a2c000a655e0ee5a7751d7dd586251ee9223fa12c213fd0e1819199648dcb5e088e505e858a430983c8c5114829f0692bd24dc2ff30e79a67e88c406af1ad8c53c78fd97f5f1aed8fd7cff242ebd72b69a2ba4b820a1b3323ed00d33c409d5e0dc37a12e2e912a8012ec67a2c1ee84937b365f49a60901c6c15e1af75784ade7b5e5aec52b982467fe502dd6295d9068277169a8c1e90bd23241e24ab35fab147ac85ec7802f3998c362ec8471cb3f6a1de8fa98758a03146cef679e759596a6c798e9cba957713d14d4863dedffbcfe73f34280c4735e47d41f26d3bc10358a5630d110892068f4b631f4bd761f0a411ab74d8d9af8bc3f5154824deb5bade7f4c536147c841ee78ef64f5aadae651de0fa8cc5714659f4f7cd1bb3afcc7c3319083854b2eb6754e0862a7655c9ce6d4851561057785b08738c0dc3379cff4f9e994e75521c48bb5315ddbf1293e7d4c133fcc6ccbce864dd7279b87a2881fd4dd0c2edef5ec63c35f8abe7ca929a5c69b7e5e163fff73c91fa529b213925cce5286d9e7de110538e780bda9927d6aad3fea6f42680ff4ec2e17d962b5475a9860123b61b2a3f28489e077cdad59c6b0cf07b50613608a04e236639d073bab8caf33c3b94d15feb1e030994b78009801036237a35f3b0a6153a378709f09b69798cbee6eda044ebf72369a90da41a8d19da6e4d4db7b04687aa345ed900b153ac98266fb7a7d91d0be5c6a2663c0a8c5088937dc323bb1995bcc5885417a432db10eb726a728c1a8cd75e446fc8c607385a199b135ee2c55a5f5fcf1c302b45e2e42f1bf0ccb42abdc5df33d9829330b07e37e8a5226543afac32b9bdb76d964fe4311a3aa6163bc7475f513f06feae33698309a5dbc0f0278a4ad8cd7a5f4ce5b9fd45d89b289f97f76e4a10f6594ad0f6cb733de28766668f703a5791a56ebc9e1074f6aa7c9f1a9aac59c863bb0880ae37646569cb09651cb702de3c4e8127b6877588b466d161bd885a620838b2405b64a0d8f5322e2f36890d31d93e127dbbc774ca0edff38c39b621db651b334a5e0316db6331311fa0e2be29e23e19a9980d27f01854787f8f130c9fff4d36d79bef818b542325a0b10a2f0077e78079d6f9dda8b0489a19f3fd64fbfbf7077d4c132a74b5c3b058b9738d770503874951973716b472fcf0b67ca0731ce9a5c69b642c5d113b3878f10230f9632795ff0b42c61d1b297579e61572a1e21541f2f242496d40c3f4f65f09af6431ec9ceee8d3bd1008d6a1a6474d257fc91ce5409efb4d05af2107a8d8c77c12a96556a8911ee369922450facb2ab37adfeb1fc866d0575402e69d6ababf2b4e521736e6c9b98ff97bb9b3d8c62c2061502096e1933989d538e9ea7e4b6a273697d6227e0fa8e5a466c33240adfc924f2fb18626003bc05f1bc53732d137f81211d3a9c984b02d17583a0a3daf84de5db69ff4ed6864ef80d0b6710fac272241acd9c8d7cccd7dfd833fba59023fd8a0879e38fd10bc326c78fceef22a1b53296b04ae756c2301b173477e47cfd203efb5a813a3efa074fc02880fe33acd21e7043686afe692a80f0d32d8721dea165e6b3cdf4aba92634b08e03638b72c18155d826d8e5bb08d27ffb17a27d336f85b2f2ce9d45ba84480350de9f2e11bc8038e2e16dfb4b42e2a284f1ad76620cfdc492f0eb0a83bb2b714c87fa4383b732d5032c238e8a88321afb788463c9c89fc8ea60e2613d24f2280b52760548e90b9578e8809412349322a3001096c4fd38a964d9e96fc481e5047865d1ca7eb90b3ef78462fc56be3af4fd61feecd79083d169792c2c772ce57d485bacd096d43d671dfb14a923e29f3b69d00b4d86fadc10b008bf36b76caeb0b01539692f1f30d840e70b1f98b6cc8df00db22c4e878a076fa56d1ed66360c76741359c4fad9898c0a6ca8372f38a55c426996fd0c8065a12d609000350467d90cad8457994915280ba2c6ec0855604a78df237f9ed1a0c3cd355249ee0b4228d2cae947d0c2fb810332585b6bda29cdc379183a81d7e13f55d1c58c828285b636143308005944680a4c03734f1d7b885eac76034616a6c475dbf1be5575764e082260031538d5f10313c4c5f415421ac804ef257ac46028220977241834f6340931c9415eec2c5f0eadee6094eeea8babc870f3e686e0e18f9d77da426b3eabb1bbca64ee5fae33090657cd00f0e5bac303b344207f8ba20d23c6d55825ab7ffb1ccd4115411c750f91ad2973124296cf5cf3c1bf132f9f7bb8f736f3d5ac43c59e1330a1c8d5ac0af1bf3c42770eda2a401cedd7788ff698cd2cb9394b4ca6b8a7256c75535c40018ede23efe779091dae50f257cbce72fa8eeab60dc54f26ccc5de3c75653cd1069cb551e5679aab733514ef785371e761eeff3d43d59860bc2210e930c1894f02b5ebfaf1f7b3c1c02c8249e347e878d4f8a3746a8d789ee32acd5dfd1ee4b50126abc6cfcdd796c9b02ea234f0c885f23ba830b39c14a32d2af5fc5022c0cc095b6dd194d2c57186d6ad5f4e583303aa54e2852ea1a0a49cc8ba701f7286fa0c881641f81516dbadf70649ae7cc589028822748a35bf550a9bf216f3c5bd250c846418eda9e0a113812234e03300c46857cf0a7d538e1d0169bf0b82b9ac1401307e658092103965b45ea5793a928d7046734728dce6d40a1caf0a02ca5ca2046f3e16e7e7ac2628390fb3c1ea1a7a70dcb3c5a9a1c2fc7333045be392a3c50f718f353c3f7c38f4609b2249471fe2b1318bcf1fe272c05435f1665ad9ffb305506dfb3a71a54e93113bb30111532afcffdd8a48e76dbfc6f8f785e0ddacff07b1e06f788da22b02502d075e4182a53ff4e383cc647d0be61e138f1567cec70e88c49214b0702c1b047de130541c2b172a431ad3ad8f5472fe8fd2abe056550c4b555dcdeb49a011f8c80b3d4e9adee65f614ab3fff1cece1a67e94a47fd610d2ddab98f37acb5ceb36e9009df0c28064bebb8aed10101120d4ee141984ced0e9e019458c8c7b2189283f45241ef25b1bf58fbbdbe275b675cb9168a82a6ad0f398e8e0c8137e25c87f16d5b26184be7efc9b8724f7e4b1dbad78e1de908440ff361830480124bc41593ba7c520b042ec6f7429ba81c9b575642de156272db077e63a510c74cf761905d285aa1b05e51130a9f66b5bbaa4b2f5b718fca3c190b21191319df320b681e9ba1ebcb44e277b4411518b38eaa6b60eacfee45139f04fc033a8fabb357c3b300a4e633b529639a0d324855788d1334071a2e6cddf40bbf0820d1bd83a7fdd332f9ef1570e1fbc09b23d2b23851b9ea4837eabbc8050e2e4dcf85c9b12eca55fcd11938c6455fb66767f483399eacb088dc925d1c03082e9a6d012c14b300059caa8e24962afc255aecb13ef0377850b230333b8ad40de1c79cae3d4b7c9a42385776c9ca1d353ded768158ea88acdc7a7822e2d10803c202cca74b981151408153d3f7687bd87d418dba65446c38fa1b83399124f4050c17725f5ca40ea26d46d47ad2c51066c9c447fac8b19f70b42b647e2f75c10eff7f9b9d12a6b5a4e28926d44df7d7f06797f00131a60e01641dbcf62533990c7059e56c6eb6a2171b2540dbf79d619a18428501db10c501df8948ccc4a2e10fd891caceaee46f883fac240c0765684076e80dfdc442dbc1bde2450ab1b2f10d1646a5f61f206f554ca191d8a285bc77bd6c2fed5179d446ee1dc36165da5b042a5c324ade7e40e32ccad35e280749c19d11140098e2ec76bee592e23e33d2025eeed9a49024e12f69e8e42465701bddec5fd3d1c7dda9e37af7df82af1e090c9549adf101cb4e770e000a78a2c5bba893079c06ab3987c404cfa6d38b3f9b04574a42ca2d4269a6275c65219b0a0a5861261f78ae1e8305ea501c5212dfe501e1609e36908b70d7a87b248f80b233fd38dfe2f283d25fb8cab3f5afade7b7018e0dcf66f4a48001f848f30aabb5c22d7e517959c000eb0c951f52cd335f5b0d688db31758ea52a44cad6d6e08f6f2c1912a82f3811f7562929691c295a4f00eef551f43e0d54e0e47fe877f7073b48fd34de74c07a69a4a76bc171d8d3eac0532c145a8e219b0138474184f02c08194c7b782c443b3383f1ed5166f8fc4760121e5ac0037dfdc87d4149b9070aa20e096b8c0e34e0fadba6809c46ca3f23709240fcb585374456543128966b6b603347f871bb0e581cc2b44b16973b404c601c3d1c9b02925596ca31fc8687e38d5d67da0be82e0083891f93273d46a0cf0026c348c89e3ba2842a98b6f41f2682869519b0b25e2eafe9fb87b64b5fe7c8c00a7a9fd441a9e46ac2545c288cafad5bb1f0c2f1244b61c8157dc534642c9a801b84c91950ab3b83692cdbe83c9d0dc3be219d18cec906d4ee9fc77402b43470350ccef3b40c3a6f413d5530f81035b2d813e40615832dffa45abdc091a962a040c853ee64fecf9492fdd7eeb27a28b39367247b59aea4c215a39597737ec7f0ab6fc1f36e03c5d3735047c3a89b2a377557bd6d1b858a1e62ecba5b2f615ac026e3cfe4147394c2e3ddb21c4f6b3ef1a28997e77bb535c81f2f08d8f01df3308b170c7149f71d21ca79cf87f4d637764bbba5a6747b0a430ca17b5b767d24d02c331ba5246333cc886b0a5f67286caf3544d5a156716659c3f95064724534305a3cd6fb89a4ce84b55ac4b77b35695f7f460c1a78b8dfb3f6042222a0bced803511ab688c358ff5ec7a538e29329af2236d6d4f8bbfa79e88d246a312d1627093defe8d11381f4244600c46dcec063811086ecf97c4df2b7d82727d1095585043c3dcfa4b1d6f7007a81f605236be657e364091e9df7a24c622d14b371e3b602d22e7f68d43024247020952c5f40f7cce8ecdbe1e1cc766fa37b589bf048e40316303bf71d862fbcb027a59794b9118d9f0ddd426422a753daffd1f418f6e10d84283e23d0b3422536360a959d0e9a1784da2be4f1fe658aaa0e11fbdba7030ad2b9ccff0300500e6e969be3aba514b36873e52216665d8f0c0157c6d85a8e0a4021696557665cb08bc50ec74e5632bccb41174cea6229fb1a8c77f574e9a50b2192148f5964654941d03cd8b059c6f78c46069adf20ede1199990f05bc2680ecc1698335a1b4646dba80f861f246677ca7a51b0cdabb65b4211e4bcc910ff0e4d46493511c2e9184ac3a2c38a185bd63a43aff51f2dbe7121d6e4e6e80d2d08db5314da37c967c00309f359c5f85cb1e97f960937d4aab7f5ea2d2b3ad874054d1d8a1dc2386eab5cd49b271d51056dc325b0599054c39646ed68745e09ce0eec7fc942fea7b4cebea30e292f34699dd12a49ab6cfd04bd674b6df7455df6071fdb59435a67607a0cb714deb4bec5555cbe02bd4e9526da8f65b18e82122d0737f3c5e9e69b5689ad51518e902e139263544d4c77668fed40d088289b8de705bfb595838852cdd64fb6206ccd1fac10ff95cb970f3997fdd013fe4047a5e90a40ae70d31c2d68b87d04276350be3f56b3086606cc62123ee5227f9a574ce501c7941ae460bc31d9bd5c3b286632c220d874007a8a916174398254cbfe0d9e0b639e4f3bf5ce1cc4972b8f98521a8829a170573e872b8395476d4665b229620ab46d13c16d265752ecf07364bd98006182b08eb1a188fb9e07f24e65bed0920af95428e58e0f5ca8a128cfe690a8b5b9d876b2820c9d34978ae603d1c1755d0583505caed3e3e7d67543f315b8f6037f1423a714e57ed79c9740a144c1cc1e05b1744a2262fc441f91f02b9fa0d91edb596ef1ca914bc7952e4ab7d7e9369f0ba29a1221986426192cdfde19e61b62fa230b5c47ef3c3c5f49db4bdaccef0001ed3da09aa134c66f2dbc2f1081a1f0c4d481d8a6c7b073188d82914b7ece99054e45b0862897536fd80cd7b8754c4be2d7ea7a23633d0df589a3c73a71242806017365cf143aabd406f43483b1434d5d7d2945e81c51ace5cb95c85448fb8f0a2d798bcc30110bd466b90033133dc65387001b279dfa5929327a1cb0cba60a02b61cd37152e8bd7aea25cdd5145771af7eba4965e466ee84ba38178dbcb9ea0a109d63ea099fce0474823404573577114d0e9344431bfc5ce6cbede3cacf8e0be2ea04352faca2d515108b1e30b4f42041b5bc02f570936050a6be34c6b4680279c5e111e2ac999c8bf79358234660a0ca3bae27fc4074b442f22222a0cdfb007fd8c686f09c710814ef74de366bc4ed0383be994dc49034434c661b881f0e02fe4acfc10454cb8b11c7d29499e12de3af1e0888ae7d4545ea7c8ea7284700024ab1a82c46cf0344613076c6b81625caa2b3f3ecee1831c6eafff11b988f7003eae8dbd07ced82a935cbf7339d9265122ac7c5aac2343753a69fbb2606677004c5e435e4b66a145a973f779b9a84645832089d5606c30ead48795a2ceaed930daeac47b228ed8fdc96f3805c13d88d6c2507ea5a83ee075de3c15579129b040cf79f3f8105538771d76e6d9ce3c7d367ab6d3a5fe4599dcab321d61b74f75405239406c8664c4913b70f781610ad810cbb98d1bb0455073d501b1bb74a1d5e03405afe90723b03f6927f92a838b0e64c67570dfaa6649dd9e4898c7741e67a0586ed33fab0bdeb706126f6a344d99259b68b4ef231582ad1d32277d167eaf20bf94145c1c23fd88843869a0d2056f38042b196c43649e0ee16a957ce9feb4d07f588e7472b6ac4a4058755e9cc0bfb06cef3d6b2815542dfcdef124f75e7b30f1d8c383ecf9ed225224e6c79f4c8c6421d9485f5ddf512d1beb3a0d6129e45057d8aa4b6d253974d5b3bb4ea51e95bf7f1b66d483ac15323a49bfad39e3dc50bf430c377a964898af69640837aadb8567c55259fee3d2c605d6822c7ec9bb2015eff7ba4203a25715e4c64ebd01c206fbe29710a8334e804f78a5ad4d68dac07cbe15bf4b3d562aeeb0315d8a8f7dbca31f3bf0ae5d6f80d0b0e9a41f9fde6044ecef0ff63e6669c27773eedda8e45a54240e0c18f65a418b8255db68273510e254542ddcc68f3c34e7ea6041beb816070e47c9cd365cf5f1f73246d3d480504275af11e71f3f215b8b572242662611836931514192dab559e71ba3fd82301010844861d90dc8d316e0204eb65eb48270231dafb0f974ca3329b5fbd6c8b62020ab3fc0fe486619647280d731c4eb3ab0a1b7859d92a66ba1f5777d7585d6b0d879abf37fe8d35636bcccbb92c6692a602a12865cb013d31f27673d7e8df3e03b5ecb328c78e4102e3b64cd274f59676643021fc1416932976dc230888bcd50a060a954a12481b4915aa0c6748594004fa1fd64ce42055a24da8af31eb124809025765940cc5575cb0cf67da159ee03f6794e5d3381345c8567037af1e31a704161d5d3a5c44eba8f81e1d69c9c273e44c1b112424e87306d692ce5557478c08de6530d320ee8903dbce454a79432573c75c2233dec2ab221b6945d7ed569c05f9b4f8188ee16234fe8927d32aac416420af253bd2dd3b8636c84a435a45c6002f4c38377704777f5faada0882c2476f1296743c902a974ff85c4a0c054fc502c5f290c51075e72aaf2d2fe614c2529f61b16319cdac208d9d75e32519cc4e0744e732ea9397986add39384328ea628f0cd6bb8b2e6a014e2e434d838bb6ae0d1672145448950b8d90cc56fb60dcd642cd12194c6177c0066de85fc00de384056ebb08e8bfadbe7e6b34e405ee214c37d5e89b741bcd02ee9ab42be954649a0446f388143b6b2c67b8f2e18e0e46ead4b864b6e2b95ac88e245b407e22e3530b84c64811632f3c788cd1383818c1ba57d0d86b72b147806ec7721bd3cf5d210bef6d69551a86d34807d7530e07a4ae536e31f527049d6ba285d09e011d13120078d5f9b5e20e0e5d201ca14fc46c9c2badb0058b31c50622859937cd2e01390cf5b84dad736887e47be0051075048d00920599b2ffc7767f4408cf4d0442d80c3e2d24755f46d0f1c854f8d945f514f8931f40885a2b8de89bb665df66ce3907ae870b26e13524ad3befb04b252e6416fd19201f815c5630c00d1331991d310b71b24dee3e441c0fb078691b93527f4bfb3356d1a5204e384c6c4419114f150d8b173c91d90a31565d8113da7ee6f2437818e3189deb172982118deee1b82805020a189d6438f8f16592cad1abbf916b9a217e8655fbc442df3b7940a1395a0f01335f1d62724e4d569adac056d29174bf3c5c7935d213deff9851e9b68eb1007f80d2cfbf7d6e439ec59ff48563b0b9562762317863e8132742cf3410e70b0a493e2a5860a7f2897abe1a2566936035dada39b02808b11eaa589d5f5786ed0c353f32e14a1a1bcc50288edbf3167db717dc38347f5e9b1ebbb127704d5811028377572104dcaacbb36a7042ef1e26e2570e47b04fb36c982455938d8d7a20064cdf442eafd37bf22766e90f6dcaf3582d616935cac7ce66f07328e3f1aafa082cad930696849b2d4441c951d153b6e1879ef39657fd3fee03450ed00ad4f30daf3166d8dac4b9268dd7c4a0be2ac58788c00a7168d3bfb9eb5d6959fc9294096bcf874c5e40394436c8eefe955c893ca62cdb4c4e41924807de1e4e17c06f0f11a221e17a2e5fde25a56675f300d02d4d8c758251d566cb30666235565b7d0a3f97d87e55b9a1f6525a6944c6d6b685f991e066da52943192f51153dc56960bb2327bb543967a0b108beb6f1aedaa02efed85096a4c1df662798b9a657323069322aa915c82c0b8e914920846c88a7865edaefb105355ba9d408313add2f000e6e423c816da2f51fc07a6587a386adc71daa7777b3c26260ed88c7f6329b903d0115f15365a95cb0907f8858bc1fd7aaf5782161389182bcdc01ea8a7610a0d5d0f19366b4f441c9f5fb967c0f7a41452e5c313842a5f6c007e2754e2859a02fc5d87e7467d96916113673255ad0ba5cd5d529d8fa878382669a93850472b03e70abfb5bfa6a5cb9680f0b6c398ffae391b0ebbde95164896d3705c4df25100f2e42609e655fd615a268aaa432339aea51f23ccf1fa14d05ad26be653cf1300d7ef4c0987d42152a0fce530e809b04d5f0647d86a00c65ceca94adb65f92f00266921382000e0907b9eeaef4bbb3cf859b26b43787d907b184914bde1bfaa0696d5f9aad537953e279d92a201d2bffea6522dfb98905e0bd440d5575f94190417467be4ac2eb642ee5cd88d79b8da95199831bc0bc25087c3c85b68b8fff40eadff7d7f75271e6f0c0034f718cdeafa093db2ae59e827d7cb8154f1f4e7e804171575a41d87f23cc4215fbc49b990cdd9526ea94142de63607c19ea64e2b007161b0bd681eae0f2c12742331d0dbcafae0b1564c13693e7734364c5a038e50b3ca0d6469916f200f7cd08900e6472807fdd6393a41edd5fa0328eec51c53b0ad7e88417c9b71155bfb202b016190c875000f08a780e7b7668f92f4365906802209ac6f4773d0c0979f8ad2eb34370bf96f1031b1cd186ff5b7ff33874e1e308c67c2e2ad8de1aadc83d11601feb155f0878a358dbc178dc0b3bd19290f426022cbe8345515bbfe634256be2f4e4aa1598c73c045c1435a0681ef8b4a26ce705c765ae7d82d9704e20135096d26ec0908615a60e50bdd88b141173f364dd9e0fa3b40aa6528aa335066686e97dd3490af006fa1f43e1c04e027e0a3ea0360803aaab936e02fe39ff42598e8d46289ac8d2ca434aa1fa69d2a0bd32ac38ce430a5121ad4bb2632c42580fcb29a1d0dc8ba5798bb2f26917b0d0ff52ace06f9d03b50a64fb37ab3fbc9d354ac7d1d78935e7906888bb129a87c20075c50461800c19bd23c58d552fe3ca1a626574013609cb049ac0e865682f972cd00aec271f03a2d935b5ffa73cabea19cb81a9dc120d6d878f75f022983d626b52216a69230ffb5da0c330cdae27f3e91dd3514c57c3230fb472b50ef5e79bb18131427f34001e3047b9a5fc4410c6448fe4edd60b2ec82c70297c109eb90ffe56df8e926801d32c5b656ae22bd25c4752371420cea4a3bfb174f33705759cbf246d8bf9cb058da3ee8a38d8dddf23fcfdf0f25ce190c069361819e6d210f6670c312470c9037c48a4a8f323fc38983af4f784ec185d277dbee2c769b63072c05eb43b25d80ee7f8e640d152e92a3f870ca6dcc483f0a6f68d909abaa910d4b1ee437f04040f511793176063894eb30c36d13421fbe11b90fb48b2381b4240214147ccde410e6941aa8aa359f49b12b732d536514b1897738f461be3ce2f102b27d1ac41e5060601d02443e402067818eaf7da156171a458d4a7efe774bc1558b50614217609f6ff7d7109f2912fbdf1faba76ed19d82c2c34e4e3dc45474827467de8cab80d4d2db059602710500b3a5c2f31a24aebdb104f8aea09f5405b0cac8816e16f02e9058576f0ce04289104aa6763f7cc3236e6d776b5b1b16fdbf6b1e64b6a75076b2f0bb491c36f64d3938ffb08821690da64f271253c349ae7a1994e4204730c1efb10bcce4930d44678f3519535b37aaa3986225d1c27c3fe0d980d2e3b13019a89796d0a3730531c5c61252a451df70dc9f4f0e50873a517976343fc89cb0ef276e7a145f2055961359cfd925be4443f14aea6337bdf9d372aab9afc3b4c06146aab5ae731978385b9fedba60c8613ebf509e6c796f2a9ab7cd8b9f94907043361d6e215f5fc29c201af7301274cef05acfe1780c64f79b65d62e84a91e50e34f6876aeb352df01fb889872e29b83e05fa1c8fa7eada9b8bc913ee2a73650131bfc89e51418221a06decc6d2398c02d7db58238eb3ca5fc3e3d79ef9466d03777660dc85b4352b3c80c2ef1bd96f8c302080cd65531733808509d700378f035360364d23a4b7aa140dba3636c3a5e046af1a833a6998481380694ceed4470f456b4610eae98b1d470ee7e2585a399c49986461fae4ca97a43fa83430fdcd003007642e784b565a73d03d817cec344ec81a26b4f842f4d1af3ee49ea93b6d024557f7a50e8bc7207fe1adb413fe154d6497a994d7c60bca3d5ed79c2d8406001763e3f0de86b3a8c3d0466a7bddfc6f6dec849bd9436478b5422f5a90b647011b1b468d0c1e2e6cc63fffe6b6b56109e4702719d4c4a52ccd1f02e399e85e003cc534f64b0b4721ab490d9202d05c128b20298b966044d754c3dd945f309a0da0e37da0bb326ab010187709036da52326ce317716dcc0a2b517fa91eabc1f036271d8242a4ec64a56263472566a365f1a6a3376406e15ec9b9af81c7e1c0c02926ad9372f06a274225d276141407b10fb98341700809aa4f497cfb15c403f0208e837ec162bab609ff2df881e345f61ec03b8d06119a0cbcf19d39d0fac6309c66ebc27ec801ef64d3363108aa0240d77584c937afddfc8215dd07bc1b1fe0daeb268781577132417b90db5c522ee737e1b3f3c9cd01f600433e7271635320a3edf04e2790c9f36e3e3bdfd8d5f7fc1369c416a3772a0738c4578a2c6c9520a21faf5e49488ecc63a9251b6f495afd059c353e95650d40fdcd60bd9ac8cdd0a8673b419b5def3d69a27eccdc4333b4ea592da1642eacfa65219c68f4dd7580cc56705adccfc61469076a9f0bdbca257fe77fa3722472ddb07c91d857fbf20008d8d39bd72ed5f53113996b4fa829c0a1cbed4b3feabcec3c377220ed76c340c8b1ad75c80f60e901941c1f0883aa03e9aa3e81bf239a788fdf1b82c7e59360873ffb1dba43ae5c9ecbee26eb049fb781d36f3396d713b51212fc6394a36580e98a9bf610201a3a8e38c4db4597c4981497a73cfd00ce9095cb6d4955ff83100932e820461de7da9b293f3de9c1473b099f21478335f8b53367c670af5822706cc79743546e9bf8093361719af338a6ac6755d17a25e61f832d72e592318740e5eb513bf005bbdf5d2753d753c89ae66c68250468cab8928614e111f8663080c9567fab81d44dd854757c8ac2f44299f144bf2669513cee0856ae9ad02f9ac0d65a51f43f175c9d224eb5cf4229d5a8b6bddabbe73300ffb20a1794c4fe0bf05adffe270e7e49e3471c4cfb5d619744b6121cbdd99c70b45e60aa48732bbcb06e0ed19742fca2bc3780025c96c6756ecf5f22d3ac71c2ce4ef25803ee57bd20d8cbdfd08f24dc01e2aaf3d3451573abc6375c95b2bb3a2a6110150d38772e70648d5df57ad040f7f2f8012866908cc6922b1e424e1894f2fafe19dac18efda0b734445e2cd736a0ae78c17549e1f8e6a1b37be7930234b75d06c6518d507550eb625106ef26cbd2ab90a62687c4d84439e416a25149d9d91ed98ee540cc6a80e3214ebac4c497a977893ffa61b061869b9d73bbfe43d6ce10a3069de192a9e0cf45e7500034da980497bfde570b8527f7172fc3c02b140a6d4f62bf9060f1c0b01d12f6c37fd5f30ac0627dc9285e354097bd7fa502daaedda0b769e97a3570743a845f2a18c22a88db9c90ccc9d42c6a51555a1e67b0a540c492659ad5a5a0a9beebfa4dc30670eb5d03d4191a2ebc442a45f4bf22f9d36d3f3eaccfe5bb00588edb09ae238c60258ccf86ca3e356ee2cb860b80d7fdf8c82e939e7bb97ae02b6a1ca23f1e65a03e7b7ed8cc7108378ba36d58a9af550867dae21b0363079094abc123803d6dedbb7cc2b0ff42a3c9f8bfd5e7f7cf4ed4a9f36fdce6a6d860f3b9e0c607377ea35d363f61537400dd5067899c745599af81c21641ce49c680dc95f13953f9b385e02c7ffd2b99875b43c365dabfb4665620008384b75c5140fd8e6552fdd1f1fa539de0186b7ff2537890935157ae0c8e78b6053fa737419017aa0987b5966c29126cdd9bcda79f57bda712bad032c4de369b91abae075cb01e6eefad1fd170890f1c6b7f3a1d7664d0391857d7e114f3779bbc264458084032e24f9cf228c862f96b34468ab6e8eb406414e9d640a4aaf274177afd2172705bed8ae917f04a51d2ea48a9018d41bc571e248684fcb2093391ebd7b912a53042390a2d9a4abd6fb6dd44749f5261977423b71da64c7e79fdd6fb5911d6df309827a4beafecfab05ff45da500e35b247dedaba4e9233045521e6dfaa138be10bd73e7c087d5ed774a89651c655b856fdd01ad5c98c7836ddd53545bf709aff017b550693cd7adec89c00699bdc19618cb3091306bb990f39800b66560c26360f65915d036d9030af531d7dc108f099c9977c1463cf63973f3b54179d3f34cc0d8f782667711544301684b1f5d5a59434613a89df992753a1a250062180cca2024107d5ccbfb8915e452d7c16ac2460ca424260522f685a53e528cf7bda999e0b61935a5f7886ac2304d11c186398e2cc94f7ae0b8f08ad5e1295289b6efe640e"};
//TX_FROM_HEX(tx_hex);
//ADDR_VIEWKEY_FROM_STRING(addr_56Vbjcz, viewkey_56Vbjcz,
//network_type::STAGENET);
//// the ring members data from the above tx
////
//// this hex is obtained using onion explorer runnign with --enbale-as-hex flag
//// it is hex, serializied representation of of map of key_images
//// with corresponding ring members output_data_t info structure
//// we do this so that we just mack all the calls, instead of
//// accessing real blockchain for this data.
//string ring_member_data_hex {"011673657269616c697a6174696f6e3a3a61726368697665000000000111000000010800000101010301040105010601070600204aa9d101000001070001a06631316433336266616466633330303830393136333966303333323131346662353762373930663263316363373363636538326335363262656338313132376330303030303030303030303030303030666631333030303030303030303030306263306561653562396336616436333837613431313933633436663363316430373136643737643634653232623265303762346263653735363736356132306201a03039663566643065616531656662353732396362636330656464396335316330316536376663626661313066626435326338613631343461343236333637393530303030303030303030303030303030303831343030303030303030303030306263306561653562396336616436333837613431313933633436663363316430373136643737643634653232623265303762346263653735363736356132306201a03536383337333263633563373537623334373738663331396565343239613234363364663936313263623334336461623263303432346433393962316165653130303030303030303030303030303030306331343030303030303030303030306263306561653562396336616436333837613431313933633436663363316430373136643737643634653232623265303762346263653735363736356132306201a03164333966383364366163303731616435316465326132366663326266656163623464343738633264306432383931366535336537613535303263303737313530303030303030303030303030303030306431343030303030303030303030306263306561653562396336616436333837613431313933633436663363316430373136643737643634653232623265303762346263653735363736356132306201a03430316533363332636139643062313463393536656238323135363635366665396437613837626161323132343736343738666536343037653664363331353630303030303030303030303030303030306631343030303030303030303030306263306561653562396336616436333837613431313933633436663363316430373136643737643634653232623265303762346263653735363736356132306201a03031313534633661386161653539373361393137323339383836663836306163663135633230626661643632373963353939613231623233333733643061353230303030303030303030303030303030313931343030303030303030303030306263306561653562396336616436333837613431313933633436663363316430373136643737643634653232623265303762346263653735363736356132306201a038623762623235616132336539656539396564373430333066636262613231383436306463343333326437633166663830343337323434346366316564653461303030303030303030303030303030303265313430303030303030303030303062633065616535623963366164363338376134313139336334366633633164303731366437376436346532326232653037623462636537353637363561323062010800000101010301040105010701080600a007c2da5101070001a03531623763653437633337616132363839356633313230633661376566393837343062326332626537306338396630303734373133613036353966313262356130303030303030303030303030303030303031343030303030303030303030303432333236393938353133306631363635313661356261383631303936643732656363633637616461626134356562333733396130656263363161333230616501a03365623234383835343166363130343036393466643161373433353534366163373864623531653864386539393535643735316665336134383233306530353330303030303030303030303030303030306331343030303030303030303030303432333236393938353133306631363635313661356261383631303936643732656363633637616461626134356562333733396130656263363161333230616501a03864323330666663336464313639313064393034366539356331316538323365343566323839316632356233643836646236643836326237376162343661623930303030303030303030303030303030323331343030303030303030303030303432333236393938353133306631363635313661356261383631303936643732656363633637616461626134356562333733396130656263363161333230616501a06261373733653332636239343263626566373866663933393166333062303438333031313433643133626330323132313133316334646235623734633036643330303030303030303030303030303030326231343030303030303030303030303432333236393938353133306631363635313661356261383631303936643732656363633637616461626134356562333733396130656263363161333230616501a03136306563656530383365363930326631316365383566616262386237633437626331376136383932643937396165353563626332626131373939363564323030303030303030303030303030303030326631343030303030303030303030303432333236393938353133306631363635313661356261383631303936643732656363633637616461626134356562333733396130656263363161333230616501a03362323661646532633131613339663936386663656261396564616131306662643338333966353662396233343165353331623864323737396332393839383930303030303030303030303030303030333631343030303030303030303030303432333236393938353133306631363635313661356261383631303936643732656363633637616461626134356562333733396130656263363161333230616501a065623337383636663032616235666330363135613039633161363438643762356233623437353065336131643838373730663938343532376166306137623033303030303030303030303030303030303337313430303030303030303030303034323332363939383531333066313636353136613562613836313039366437326563636336376164616261343565623337333961306562633631613332306165010800000102010401050106010701080600602225aa3f01070001a06232303433366466353031333766373030333065633934383663646530366230393532366337383933313937393537633335663965393165663265373132336230303030303030303030303030303030666531333030303030303030303030303537643334656637353433626534376237626634393763653461313736653738633664363563643332376636346261373563323764313537623333373132356401a03764646166616338643637353065353936343632376263646333626637373135363538666130363364313430303764386631336433356437373739373262346330303030303030303030303030303030303831343030303030303030303030303537643334656637353433626534376237626634393763653461313736653738633664363563643332376636346261373563323764313537623333373132356401a03463663135313965323265306361613632366638636165663131383234323237666232663438313233313539343231376531653139323636333966626431643830303030303030303030303030303030313331343030303030303030303030303537643334656637353433626534376237626634393763653461313736653738633664363563643332376636346261373563323764313537623333373132356401a03736653630306434613336616436346530383734316336623364653065383066323333653864353130326434306465663161643439393936343861653934343230303030303030303030303030303030313431343030303030303030303030303537643334656637353433626534376237626634393763653461313736653738633664363563643332376636346261373563323764313537623333373132356401a06131313033326436303930616439313834666231396661363432343862313062356632363665616665643135306531653239616266323130623562646262333230303030303030303030303030303030313831343030303030303030303030303537643334656637353433626534376237626634393763653461313736653738633664363563643332376636346261373563323764313537623333373132356401a03539333162323334313636643439393130383730323537353638636564363465396438653431386533313333336337336266666464333538326637306430656230303030303030303030303030303030316331343030303030303030303030303537643334656637353433626534376237626634393763653461313736653738633664363563643332376636346261373563323764313537623333373132356401a036356538323937346461386435356565653838333432326462366432393339396532353139643265633038313763396138303135306638353262383434643338303030303030303030303030303030303261313430303030303030303030303035376433346566373534336265343762376266343937636534613137366537386336643635636433323766363462613735633237643135376233333731323564010800000103010401050106010701080600602225aa3f01070001a06232303433366466353031333766373030333065633934383663646530366230393532366337383933313937393537633335663965393165663265373132336230303030303030303030303030303030666531333030303030303030303030303537643334656637353433626534376237626634393763653461313736653738633664363563643332376636346261373563323764313537623333373132356401a03534353832373634303333316465306532613262323834613663373435363539646431303463383964376639316533373038616237373535316262393662653430303030303030303030303030303030306531343030303030303030303030303537643334656637353433626534376237626634393763653461313736653738633664363563643332376636346261373563323764313537623333373132356401a03463663135313965323265306361613632366638636165663131383234323237666232663438313233313539343231376531653139323636333966626431643830303030303030303030303030303030313331343030303030303030303030303537643334656637353433626534376237626634393763653461313736653738633664363563643332376636346261373563323764313537623333373132356401a03736653630306434613336616436346530383734316336623364653065383066323333653864353130326434306465663161643439393936343861653934343230303030303030303030303030303030313431343030303030303030303030303537643334656637353433626534376237626634393763653461313736653738633664363563643332376636346261373563323764313537623333373132356401a06131313033326436303930616439313834666231396661363432343862313062356632363665616665643135306531653239616266323130623562646262333230303030303030303030303030303030313831343030303030303030303030303537643334656637353433626534376237626634393763653461313736653738633664363563643332376636346261373563323764313537623333373132356401a03539333162323334313636643439393130383730323537353638636564363465396438653431386533313333336337336266666464333538326637306430656230303030303030303030303030303030316331343030303030303030303030303537643334656637353433626534376237626634393763653461313736653738633664363563643332376636346261373563323764313537623333373132356401a0363565383239373464613864353565656538383334323264623664323933393965323531396432656330383137633961383031353066383532623834346433383030303030303030303030303030303032613134303030303030303030303030353764333465663735343362653437623762663439376365346131373665373863366436356364333237663634626137356332376431353762333337313235640108000103010c0120012301240126012a0500282e8cd101070001a03062323530383665633639636333313666656263343361333166636263636138353861343638656233323661393462393238343065663633376431613030666430303030303030303030303030303030323431343030303030303030303030303431353462333436356134333732363731656139653036346137636161363665313462343938366134363638393138616661353739626631656432353036646401a03732646436613330623435366332326365623365353664643338346636633763653263323530633738613630626665646430323765353132313235616336653665333834303030303030303030303030613738343030303030303030303030303431353462333436356134333732363731656139653036346137636161363665313462343938366134363638393138616661353739626631656432353036646401a03439346664646665346537353161613535373036643639636366643532313630613661643232633138663165623935373264623934643766343964346361616366373834303030303030303030303030626238343030303030303030303030303431353462333436356134333732363731656139653036346137636161363665313462343938366134363638393138616661353739626631656432353036646401a03131363739356135326662373831316662373131366464313065353434313035653636386136613938663465353562613638636435346661653836306638303366613834303030303030303030303030626538343030303030303030303030303431353462333436356134333732363731656139653036346137636161363665313462343938366134363638393138616661353739626631656432353036646401a03339626133336263633164386165656138336331633662333062346132316666323663393862363037346434626533313839376133333363623162323931316666623834303030303030303030303030626638343030303030303030303030303431353462333436356134333732363731656139653036346137636161363665313462343938366134363638393138616661353739626631656432353036646401a03264363132363861353661663435336233323364373331383038363338386564356263663466316533623437353962313230376430353331363439303038303666643834303030303030303030303030633138343030303030303030303030303431353462333436356134333732363731656139653036346137636161363665313462343938366134363638393138616661353739626631656432353036646401a03331353632623438353266613866363032373236626338386566373836353634303238633265316461343366303733353732323337353632356166316362306530313835303030303030303030303030633538343030303030303030303030303431353462333436356134333732363731656139653036346137636161363665313462343938366134363638393138616661353739626631656432353036646401080001040135017f018e0194019501be0400ca9a3b01070001a03739653366396662363034376230323766356435626366333234663936313730316130346162633335663536373436383066343530666330326330663165306230303030303030303030303030303030313231343030303030303030303030303863653634383333636563393030636236643561633436666330323337643866323433396333646661323338626166396363393431363661643265383938383701a03761333263336263646362613436353333366136393637393963313838396266373930366631636435393832303966666364383166316465653061623731653563393765303030303030303030303030386437653030303030303030303030303863653634383333636563393030636236643561633436666330323337643866323433396333646661323338626166396363393431363661643265383938383701a03661633063656434303365633162396636373031353239343431303934613261383563353630613164393037363064613630323332623461383531316531383563383831303030303030303030303030386338313030303030303030303030303863653634383333636563393030636236643561633436666330323337643866323433396333646661323338626166396363393431363661643265383938383701a03463396236383632346234396663316632353366643534353935356466653964333866623562336230306636373233626566336139343665336439356238653736323832303030303030303030303030323638323030303030303030303030303863653634383333636563393030636236643561633436666330323337643866323433396333646661323338626166396363393431363661643265383938383701a06361333765326161356466313363643930353962333466386338643032363735396365303837373439663332303962623838306432393530326237333533613066333832303030303030303030303030623738323030303030303030303030303863653634383333636563393030636236643561633436666330323337643866323433396333646661323338626166396363393431363661643265383938383701a03532376366653563343439386662336238313862393232653537333734616639333831623630356135313833643138356531343137393838313464646230393466343832303030303030303030303030623838323030303030303030303030303863653634383333636563393030636236643561633436666330323337643866323433396333646661323338626166396363393431363661643265383938383701a03264323038623339343765656166383630343136393134356335336363663333383138356130303937323865623838626330333466373332626262663961613362653834303030303030303030303030383238343030303030303030303030303863653634383333636563393030636236643561633436666330323337643866323433396333646661323338626166396363393431363661643265383938383701080001050112018a018d01ad01b301c50400e9a43501070001a03532333361303265333634633534303136643662626536383261643533313032643765383732333232626338313166653137663035613963333566656466383230303030303030303030303030303030333531343030303030303030303030303131366165356432396365633732616163353537636231346532636464353533653538386666386238313738323630313939633430636165613231326362363301a03030386335303535666238383532646133663936373663303439386131326335366464663230376636373931623466326261313463656261616236393439646663343764303030303030303030303030383837643030303030303030303030303131366165356432396365633732616163353537636231346532636464353533653538386666386238313738323630313939633430636165613231326362363301a06262346163623835316534383037656139353166356563363037303466646133663066633065333436336266386131316133353265356266646233313137386537343832303030303030303030303030333838323030303030303030303030303131366165356432396365633732616163353537636231346532636464353533653538386666386238313738323630313939633430636165613231326362363301a06333313666373366386165616465656366656461306632643561326464383434366331353734613233356466636436356465313135646432383031303932626239333832303030303030303030303030353738323030303030303030303030303131366165356432396365633732616163353537636231346532636464353533653538386666386238313738323630313939633430636165613231326362363301a03334623364333539313638313235393434643162613934643834633638346433306565323362316337313638323734646665343561346436366436306438343663383833303030303030303030303030386338333030303030303030303030303131366165356432396365633732616163353537636231346532636464353533653538386666386238313738323630313939633430636165613231326362363301a06137363566343162653062323538363931623562623464623361326434653866373730303664393236636332373365303563666664613536646332636365323630363834303030303030303030303030636138333030303030303030303030303131366165356432396365633732616163353537636231346532636464353533653538386666386238313738323630313939633430636165613231326362363301a063626565383638626630376562326361623666346166633333613830626139373836333063323861663361643236656537346566303436313730363435336661626538343030303030303030303030303832383430303030303030303030303031313661653564323963656337326161633535376362313465326364643535336535383866663862383137383236303139396334306361656132313263623633010800010502c20202d203028204020406023d060216070600409452a30301070001a06433636136613531626539323632303437386165663461636231663163323731363966373730306366393939613830313033383665656164383039326362316630303030303030303030303030303030326331343030303030303030303030303431396637633934393130343334306664336365383539343864326566396630646434626233643932663561373832633566373830346237353239613133633601a03039616338386130383935323237613232356232356137316137633865396365656465353563383732376535303136633039656134643336346336333161373766373766303030303030303030303030626237663030303030303030303030303431396637633934393130343334306664336365383539343864326566396630646434626233643932663561373832633566373830346237353239613133633601a06537353438313264363730623031333239623264633035383962616463636130356162623465626466363261376165613664353534313731333532396334643030373831303030303030303030303030636238303030303030303030303030303431396637633934393130343334306664336365383539343864326566396630646434626233643932663561373832633566373830346237353239613133633601a03938613733666366663965356534646466356639316335363566646332643835633132356463336336333630306539646230643336636536353262663163643962373831303030303030303030303030376238313030303030303030303030303431396637633934393130343334306664336365383539343864326566396630646434626233643932663561373832633566373830346237353239613133633601a03734623636643030376136613062353766633532643533353364346332376231366166393737373831356661626138633136316564626538343737373036356233393833303030303030303030303030666438323030303030303030303030303431396637633934393130343334306664336365383539343864326566396630646434626233643932663561373832633566373830346237353239613133633601a06466613931333462333965383231383538646136663132663535653065383030656332393266626334303132396463303237343733353836306462353433346137323833303030303030303030303030333638333030303030303030303030303431396637633934393130343334306664336365383539343864326566396630646434626233643932663561373832633566373830346237353239613133633601a06337313836623937366161313065363737303062353939323732373234383138623361656266303465613365616438616430373465633037383863666531353234623834303030303030303030303030306638343030303030303030303030303431396637633934393130343334306664336365383539343864326566396630646434626233643932663561373832633566373830346237353239613133633601080002ee0102620602400702c6070229080256090262090400286bee01070001a03534363536653433613663613163643034373635363866613161346465396665306639393130626634303734336333613238396431663461613637373061613930303030303030303030303030303030333731343030303030303030303030306461336163623030616232643864636361636563386637373539323163343065323662316666626563613965623765363537323536663539363866323334316301a03235613035643861313831356265323934613335623266626435316262306637643836626436623463626533623036386537653763343064343163653931386432323366303030303030303030303030653633653030303030303030303030306461336163623030616232643864636361636563386637373539323163343065323662316666626563613965623765363537323536663539363866323334316301a03631343134376334623062623661613261613161353032616636656332333234373034336232333038383661376533636563383165663664636264613833656238353438303030303030303030303030343934383030303030303030303030306461336163623030616232643864636361636563386637373539323163343065323662316666626563613965623765363537323536663539363866323334316301a03435356637336231303633353234353139666163633739353335346535376531346132346536643464356635396433313736666334363863386436393238633035303464303030303030303030303030313434643030303030303030303030306461336163623030616232643864636361636563386637373539323163343065323662316666626563613965623765363537323536663539363866323334316301a03839363839623739613662383263376233323334333839376466383533303431356132666563343634366563383531616635386139383465386534386138353566383531303030303030303030303030626335313030303030303030303030306461336163623030616232643864636361636563386637373539323163343065323662316666626563613965623765363537323536663539363866323334316301a06664633631306631326634346463633338303936383533646562633438303534626432313231303331373434393434613331356165663432633131373435343464613564303030303030303030303030396535643030303030303030303030306461336163623030616232643864636361636563386637373539323163343065323662316666626563613965623765363537323536663539363866323334316301a038643531306634623936366530333937303463663761313437643137313731343834373731303835316234376364343734633335616139323139346662323066653635643030303030303030303030306161356430303030303030303030303064613361636230306162326438646363616365633866373735393231633430653236623166666265636139656237653635373235366635393638663233343163010800024002025c0202780402fc0402110a02850d02a90d0500205fa01201070001a06132383735333331303464653734666235333962366432653433346164666566363138653033336364616637356235623236336434623635666666323932616466663032303030303030303030303030633330323030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701a06561386530323230386332656238666636653333383636366563626139316263656666653361626339363863353561326162636639633636623238656665366130303030303030303030303030303030323831343030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701a06639363934613834373166363534653935366361623730373331623632623336626338633336366631316162326633393862373962613066363864363632323133343161303030303030303030303030663831393030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701a06661616338663564326566613835643238373531323665366238353066633962653962333835343064636537376433623166363761393930393638353335333964643266303030303030303030303030613132663030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701a03265303739613135643632383663333664326162653861626565613765306161613233656132376538623366653139643631613761333833636262393339396139613566303030303030303030303030356535663030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701a06261663364656363323232363164663634356233643331613639653038306432356461316564346330336630343033386632363263356639376339643661396639323738303030303030303030303030353637383030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701a03036393164623964663531613138626630383765306264323065663338646361336263396636373062376432643135343635376231336237343832373161343262363738303030303030303030303030376137383030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701080002520202580202d20202bb0502b709023f0a027d0c0500c817a80401070001a03530646436323038623330393231303336326662643631613631663539646138643263333132303332626264613230333635626565306561323731366437376431303131303030303030303030303030643431303030303030303030303030303039626165643961336334346232323238356130616561343134386361376465396265613936336366363936323362363833343435633061313061353836373701a03937353130336338386634303266353336356564333466303963303935663665333163646235613730383264613966656334353432396562633236373364306230303030303030303030303030303030303231343030303030303030303030303039626165643961336334346232323238356130616561343134386361376465396265613936336366363936323362363833343435633061313061353836373701a03363653262363437663932666364656238306438646336303666383265633838326331356361633537303438663235306237616664636334363732343364393461323236303030303030303030303030363632363030303030303030303030303039626165643961336334346232323238356130616561343134386361376465396265613936336366363936323362363833343435633061313061353836373701a03934353661346432396539383762323662323432616634393965343566353237643631383039343338353961336637633264633535303965333831626232626263333365303030303030303030303030383733653030303030303030303030303039626165643961336334346232323238356130616561343134386361376465396265613936336366363936323362363833343435633061313061353836373701a06337373535663237383139333063313535343930643366356538333833626630306236616563643130313866376566663063613163666661666135643361383938633664303030303030303030303030353036643030303030303030303030303039626165643961336334346232323238356130616561343134386361376465396265613936336366363936323362363833343435633061313061353836373701a06162323038396432383165653432383636613634323436323935396338626631306433333839623661333830366562393839313762353435633036333361616131343665303030303030303030303030643836643030303030303030303030303039626165643961336334346232323238356130616561343134386361376465396265613936336366363936323362363833343435633061313061353836373701a034323334326437323735303937636230363435616337666266376234646634353763383364313537363739313661333834363265613833333361663262326532343838333030303030303030303030303063383330303030303030303030303030396261656439613363343462323232383561306165613431343863613764653962656139363363663639363233623638333434356330613130613538363737010800025302023f0802720902d909029d0a020c0c02390d05005847f80d01070001a03064666235633766386435343137336632323661613464366234353566373939313261353630313562616662663934336532666661623832333035383164646130303030303030303030303030303030666331333030303030303030303030303636633261303039363566396266636262313165613033636631643633316230306538613165663761363062316265346135616330393233306266383137336601a06130363063353936643538326135666461656264626366383064636265396534353334646331316537663136336364303531323435363736646435643231393132303464303030303030303030303030653434633030303030303030303030303636633261303039363566396266636262313165613033636631643633316230306538613165663761363062316265346135616330393233306266383137336601a03537303334323734336233363139643737666231633264393666356238313636333237343762343464383036323931386466343432613665656239623963373762643633303030303030303030303030383136333030303030303030303030303636633261303039363566396266636262313165613033636631643633316230306538613165663761363062316265346135616330393233306266383137336601a03638363666666238363836373933666565656536666436643035303435383664303235363862383739313965663966323532646136316230383363623530326432343634303030303030303030303030653836333030303030303030303030303636633261303039363566396266636262313165613033636631643633316230306538613165663761363062316265346135616330393233306266383137336601a06537393363386535323566336233373434383238383765666164636536376265323462393236336130626465376566303961636337313331313335346235656365383634303030303030303030303030616336343030303030303030303030303636633261303039363566396266636262313165613033636631643633316230306538613165663761363062316265346135616330393233306266383137336601a03464396635343465313934336637643030323063643536633165613333363935656131366536653731326332326435653234333661346532356463656133356465313762303030303030303030303030613537623030303030303030303030303636633261303039363566396266636262313165613033636631643633316230306538613165663761363062316265346135616330393233306266383137336601a065316464363163303030333832616665353962356134626333383533623036366466306564646437323139636230353731393831306637356662323633656332306537643030303030303030303030306432376330303030303030303030303036366332613030393635663962666362623131656130336366316436333162303065386131656637613630623162653461356163303932333062663831373366010800025502021a04021f0502120602000702140c02460c0500743ba40b01070001a03637376232393932343461643130376530323634333463363564353538613265336561343633623637386261646564356639346664646661643931653536663330303030303030303030303030303030323031343030303030303030303030303663386530653461363334663835396133316162326637613738633063346135393338636237376630333335353061343764376533313831623662323665633001a03536633664353764643762386134396536323630336637326334303630306337336663336633356535623561383231663461353535653732663033363634336465333230303030303030303030303030613732303030303030303030303030303663386530653461363334663835396133316162326637613738633063346135393338636237376630333335353061343764376533313831623662323665633001a06665616562336635613631333364303765366330323763616464393563623935396136653264353265656361343163663137343638336532313736336466376331363337303030303030303030303030646133363030303030303030303030303663386530653461363334663835396133316162326637613738633063346135393338636237376630333335353061343764376533313831623662323665633001a03134353862306337343766316563653532616562616235646439343165633538353364373934303739353262343531646636376164623235623935336362363230393338303030303030303030303030636433373030303030303030303030303663386530653461363334663835396133316162326637613738633063346135393338636237376630333335353061343764376533313831623662323665633001a03035313562383735393132353563626563613634666666303933623831373764346564326434613439666631326339663163653932643530366239353035376666373338303030303030303030303030626233383030303030303030303030303663386530653461363334663835396133316162326637613738633063346135393338636237376630333335353061343764376533313831623662323665633001a03566383333366230613865383561616437313263383036623239373832323634376638306132366434386337363361373239303838636337313337353630663438343831303030303030303030303030343838313030303030303030303030303663386530653461363334663835396133316162326637613738633063346135393338636237376630333335353061343764376533313831623662323665633001a03362353437303461353035653331333438373634303432393138663061663063303539383465656434343163313436636365373935643535373861663361336462363831303030303030303030303030376138313030303030303030303030303663386530653461363334663835396133316162326637613738633063346135393338636237376630333335353061343764376533313831623662323665633001080002590202780502a90902250a02310b02c70b023a0d0500205fa01201070001a03966646537613263633534633865666332633461616561333137636232366166393139363664623739323565303364663366643066306163373338356431353930303030303030303030303030303030666131333030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701a06230376365303637303430343832346365663437326638613736326134616635393732616138373065343338366166326263303738343836316531313234653435393330303030303030303030303030316433303030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701a03233623932306234333466623833663263323765373164343466376330396136333763336237316661343463313532356638336633313564626664353032343433323566303030303030303030303030663635653030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701a03735623732663137323232663435376137333662656432316630306562663937643433393930633339323666646163326133653338306261653732626137303661653566303030303030303030303030373235663030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701a06437373439326237613335646232373332636438663736623431373262373165653462306636323436613933643334306166336261646234656664386333356462613630303030303030303030303030376536303030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701a06330386637666566636163643866363238316533366265623666393864393563363639376136376338623863653630353864386237623263343662346565303935303631303030303030303030303030313436313030303030303030303030303561636366643136323237396135316338623362643564333637396539313839363761323634656130363364333764666635653334353765633330376434353701a036613138623933333037386137646362376363663361366530643839376433346536373837343330623961393932316231636161353730663530656161346362343737383030303030303030303030303062373830303030303030303030303035616363666431363232373961353163386233626435643336373965393138393637613236346561303633643337646666356533343537656333303764343537010800021d14021f1d02592402bf5c02036c02af6d02767006007083d05d0601070001a03039383264353737656235613633303935303764343265656266373764356566386165346234393566643862396564396161353362366231393637356438636330303030303030303030303030303030316331343030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a06639643433613838313636303638653537343838343266336634616536633536323733636633643137366631346136633334346663656438313439613131306335363164303030303030303030303030316131643030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03139313838623939613266393265303561326565623464366637303966373439306133643239626238643131663365316338396231656333663166386438353739303234303030303030303030303030353432343030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a06239623237393639366161636165653936623661313132626235346436623563343531643832366433623539346233613137393633333332656466383134636266363563303030303030303030303030626135633030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03838393331636432373730613864653064313933333835313866626332346338313731353634323465343564623137626538373331663836376638633939366133613663303030303030303030303030666536623030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03665313563303837363432363265646564346166393766353963613364616261393039353530343839343764643531386365373437636433623838333063373065363664303030303030303030303030616136643030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a06262303534336230633135633265616564393439353334303032353832653438373130323863326338653738373736643765666161646537373236393364363261643730303030303030303030303030373137303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101080002ab79037301010350030103660b0103730d0103230e01036f10010001070001a06466643134343331636132636437313364346334636431356432373266633365366562393031646563386138623833663935633463383833326532666361313062376665303030303030303030303030376266653030303030303030303030306539663231386533633030653965386139653866663836646639653166383530376162316133383133613634616536633839643437633266316461346265333501a06265383664626331666663643761323435363739373966623665653230303734366432646361366562313734313934666263306431326435636265663031366137663836303130303030303030303030343338363031303030303030303030303233393337346431346531633066313333663065323133643863613531326666373938663839306366653266613361623634306531336365613464646565643501a06637303435326465373764643535666363643437306535633134626465393766303066356230333465396431623633643635303463363433363935623633663035633838303130303030303030303030323038383031303030303030303030306463333535336230323332376266383131643361613930316561623338616636303264383132663132643633393230383234383839343539656664326365353801a06439386137313631343465346231623636653432376464343633633164386562326233323334613463316563393262393730303662336630363836383333366137303930303130303030303030303030333439303031303030303030303030303161633364303739316238353435376438333331303733663039336661636433303964376661393131303939363439316537356537666364343032653630653101a03466613363643261373065376165323238623136643664623038396161396236353630636136633833343838386330343035326463333236616531646339393537623932303130303030303030303030336639323031303030303030303030303639373938353636613539383733663434313864643236346230316630653139623563653238343564646162653434346439396564333733393733663064376101a03239363665316234313863313264643562623265306131363230323732383063303562343032343231396535643034333430356565306136383030313337653332623933303130303030303030303030656639323031303030303030303030303335383666323135353632666633373064386336633666353266336134346139363533313336666465383633343131633432326439633333336438616333646601a03130386131653239336265643034396462633434643934393530323037393665663763336563356361356266643637633165613663373261323434313335306630303030303030303030303030303030333839353031303030303030303030303136323565393163656231626636333535643838323563636532316562623634356436303137313030313331326531663466303132626132643430316166396101080002a2dc0252f50387030103f30601038d0c01038f0d0103fb11010001070001a06139663337343430633338343131393166356235313137633064393335376638626561653931336333313238376262353333393035396637653231663739643261653631303130303030303030303030373236313031303030303030303030303235363763346664363936616166363461383632383764653830396462666637346336636237323335663730656637303266336564386462383365643736633101a06539366135626231363231353132646535333430653863343139653861636631633230626263396164333932626533666632333231383066393864393163373335653761303130303030303030303030323237613031303030303030303030303534613732386534316335303361356263306231313437643962646132633034616137373630306264323465663765356539336162633964333434376464373201a06137643437373834363537353862313566386161373131656338633739633164636361666162646635666231333066343765636137653435383935306237663239333838303130303030303030303030353738383031303030303030303030306635366437666262313163353734626561323331633433333735633038643062663936363137353638663764643438653739623162646632656438393233353301a03730323437323638663332363133373732363730346235326265326637623962623463656136363864663738633030616537663363313062386135646336363766663862303130303030303030303030633338623031303030303030303030303066626562303936383066356661336262316264373166333035306436636463383762396637363032636466316234643561336263346532366439633437373201a06639366161656632386565306233323933363431643663303766336230346338623163393032666165616262396235633566613139336563353235303937356239373931303130303030303030303030356239313031303030303030303030303834333638333366663266393435393231323931386561346431376532636164646535653634333236366665383433636563333631323238343666656363333401a06635353538346161343731303264666534363532363966373464656133653536613932656632376233313531663237363964383033393535666131636230333039373932303130303030303030303030356239323031303030303030303030303066643837316261323036363434356238306434373733666461313131636461356130393033643632306138643332303136353337326136383865616335643701a031313136383432653861303465643631326437346236626664643337623933303835316637383131306630643338633033313661313361333534656436356338303030303030303030303030303030306332393630313030303030303030303037383136656334346537623561626230383336306264346533346637313432313335313831646130303765623861353166393432616333636539356664643562"};
//MockGettingOutputs::ring_members_mock_map_t mock_ring_members_data;
//ASSERT_TRUE(xmreg::output_data_from_hex(ring_member_data_hex,
//mock_ring_members_data));
//MockGettingOutputs get_outputs(mock_ring_members_data);
//EXPECT_CALL(*cbs_mock, get_output_keys(_,_,_))
//.WillRepeatedly(Invoke(&get_outputs,
//&MockGettingOutputs
//::get_output_keys));
//xmreg::OutputInputIdentification oi {&address, &viewkey, &tx,
//tx_hash, is_tx_coinbase};
//xmreg::TxSearch::known_outputs_t known_outputs;
//ASSERT_TRUE(xmreg::check_and_adjust_path(known_outputs_csv_2_56bCoE));
//ASSERT_TRUE(xmreg::populate_known_outputs_from_csv(
//known_outputs_csv_2_56bCoE, known_outputs));
//oi.identify_outputs();
//EXPECT_EQ(oi.identified_outputs.size(), 1);
//EXPECT_EQ(oi.get_mixin_no(), 7);
//EXPECT_EQ(oi.total_received, 42433713670000);
//EXPECT_TRUE(oi.is_rct);
//oi.identify_inputs(known_outputs, cbs_mock.get());
//// numer of inputs is basically number
//// of all possible maches of our mixins.
//// this number is basically the number of
//// "output match?" strings - 1 in the explorer
//EXPECT_EQ(oi.identified_inputs.size(), 41);
//uint64_t found_input_amounts {0};
//for (auto& in_info: oi.identified_inputs)
//found_input_amounts += in_info.amount;
//EXPECT_EQ(found_input_amounts, 1669459856930000ull);
//// check when there are no found ring members candidates
//xmreg::TxSearch::known_outputs_t empty_known_outputs;
//EXPECT_CALL(*cbs_mock, get_output_keys(_,_,_))
//.WillRepeatedly(Invoke(&get_outputs,
//&MockGettingOutputs
//::get_output_keys));
//xmreg::OutputInputIdentification oi2 {&address, &viewkey, &tx,
//tx_hash, is_tx_coinbase};
//oi2.identify_inputs(empty_known_outputs,
//cbs_mock.get());
//EXPECT_EQ(oi2.identified_inputs.size(), 0);
//}
//TEST_F(OUTPUTIDENT_TEST, OutgingRingctTransaction)
//{
//// rintct txs with mixture of key images (pre- and post-ringct)
//// private stagenet tx_hash 7d492770e6b008dd74267c52c15d25c22aac1bdb5289d20e4633351c56063e34
//string tx_hex {"020002020007d48404338607a508ab056a0e8cfba183c9b7bcb1c05b782c42bb18ac36f9a03fc554415a30f1afb08a7d8f42020007b0c601e5408aa801a06221f508e7015517a37edd7b6c3434e9af2f57574838cec745d559b0361129ebc482eda49e33020002108a1e293bed049dbc44d9495020796ef7c3ec5ca5bfd67c1ea6c72a2441350f0002afb7943d2da8affd427e7fb820819c43ef41384d45fb14679fdf3029f4301ea721011495986d51cf148e45eabb455822b7cf0453541bd4899ea435256b2526b9c2a802e093f6933ebda27b6c2907bd7bdad62bcc2d759846ff5afe5671b508294879072cd9a1c82a96d40e013e73037a5937b88db9ffba8941d5b8a4adc1ff0d56ed7826beb8c44ffd6d963a39a18f77cde4b57218d3d34718285da2be28825e2d92cafd0156a706fa0d8d9a11ff77f92777f870eb16f54f3c026094649ad4ad708c990e47569e03a82d0406d277ebebf0cbd6ac5bf29f0fa5938aafbdb0b0d80c46ea5ddfdce901246437966c79c2d8a802e4c11ccaa3a0baace2aff1f052d811a65e3e18983b0b1625e91ceb1bf6355d8825cce21ebb645d60171001312e1f4f012ba2d401af9ad0e43a0874e87fd21ce809fb3a51737dab05060fd3570c2455b0ec1415bdaae297362b6ef750d34a29b880a0d58399e809c5fc0dc9772d1f0bc07f0af07bd20d6d507dde938c44cfa101a2555a43bfab015fd7ee9dfe106e4542d534382de20e4258ffa42f0e28a7a662aa9a5d81faace7f92bf22260fb4a4500144c7cd76902d56b91995fa733546229e3dd941f55f91e6fe3ef177d089cc91af2d02b85e809fec1656f2349b05c9f5950a831ff5b674b10e7d7fed9cc1270ad76b1291b840711d19e583e03cb4385cec9f3a6f63c6f721c99c4192aec41aca83edac0ab9105c894ea3edd826a601c75b22dff1e363e551348d1e0a019e0ef09d6dcaa640a020742fb672f6d3c99a925d73071268ef9007f51d7e283fa703dc475dee3182b036746510f568a3abe9704450fc1460525acb544c79e7b8fa6d98df156f0d4aa0bd455b928097aa01b75c740ed2c13ce9655015f639a90e2bc7512240e8c372a0e5e466e0c9b1378f72445deda6b1e1ba3cd5980ec9329574aa987fe960e641401973283df3ae3f39247914a6966ecf0a60248172ed066a7dfce62370438de5a06824689a4670cf73ff8a0ea1d46c89e97f48ca298fed0f24879ba94bd143b73092a59501eb7fb465dea2ea1d7d5b1a6ed87d11f3e118cb966ec550aa84cbfa207b24368eb194ef073e2baf0307194c5954383348ce6b6b76f531d2460e45903059e40f6d0d39c4962531bab37848953c612815510d3d850be8aaaf785031fdd088c3df74ca2ca21916aadde0c17c6774f5192c62110833391a286ae40408c780352dd4c0086dfe3faf9d0f7feee8c1360661f5cb7da2bc0458ec2ec692e94fd0e65971210683d2fab4efbea76056a82bc2c8d20c2b5647a7668a64cf942d0720715366f172ffe7b25ada2977eb544d4e680cbf4c165095b71c42ead73b82f4406750ee44f172083b1589e846004264221a4fe3487d8b37163df498f8d6b978805c6ad0648807f9014d3f6faa8c389043fa38428a821155d9df7bd059551ea480f3e74f07dd3bc73fb3d6a48bce322ad7f7ee55942f18333ebc9c570d1ca134b0579dd2d7edddf50eeeccaa0da03659f57654e2df839fe349fbe2ac4550daa210a5789292492fdf7f17c252d0aa527b59f2e06c8028dad3d0bdac8eef1862cc400a11d4d913d536fe5e577d3102b6314a730fb48fbaf969c95e78d1f09b1ed7104e615c7dc13fbbf1eb4fd73f7a027ba58a123b10b4a0c08bbc34b84270b8e0600e49701680af7635be6c23bf59137b62399f4d47ae7dfbe1a1b96f19bb6a42c0065e397c25a01f053e4afae6360ae572da4dab2afcbf861df98162cf7d8fe8707fe0e2f25e8c7f01c8eaa021087f17d194493bad9775046fef50b7889c8fca60d16c3d0ecc41f44e0578aea4723a404d4f24585391299cfa111d3608b7cfc6a01120a55a9313e7cf411da4431306fac89615f2e004eba2b20c94b580803ae420a6d7f40b54c06c19ee553bb27e230ac90fb1434dc63dd896d58b31d6f4e343306747c19c63c74aa37590078ceab076090855645d667677bb92dee03e0194ec5093d3b4d214be2b66d80e66bf3602d0383c77c1636c727ca868a0177b2d2559607551c0abb3a3c76ca00cf7fab972464c75fd1b0ec932653caf310f9cf9f5f6c059debc9717fdacb17c5fcf8af3043079af36f1fa6789303c1a422e2f439f5ba08a6091259ceb0706c0f20e8049d6194a34dcc8a0dd69ae55d619c6b0a70981c0731682d03f1c7b574408e2274edcbf558d98a709236223ad59ada971e9ca8e902568caef8bb4469d10abd2f9ece7ae6b5bd394900a6f7aded50c710817e79960272c0c4dd9c6c7fb4a825078bf37b11be79f00a629e5f2dada3208dff76f8540ece09ee925c20301736c20463a0f791ada954c5e0ba2e33227f0827da2ca8ec0da6cc52c3f8aad459113aa5adf7898b007fac9152c799fa47bee63cc828d8910c560794a42a5947d42e417978c301f695feffd5b1ba9daa53d1a9d4de6ad99f016fec322330494438cf82cfde89db4f1cdc2d0923af4a60957eaa8a2f5a8c1f0ff2bfcede99f582b30a2e7f2bb5c373a815907945053412c44b1acccdde0d9a037859894a7164bacafa4fb3428f420069f5649a98bce94aea1b29bd1a831f1c01c1b0dd8fc31b7fe7ebfc0319c99893b3969155def3d63ea4306ef0522faec108a16e2e57a7540d43b1af0bfa9e7aa5348da27e0101d768f6c3457bca983b320162956ecdead9d9c7a6df70d95303181d3896490b08655f84da5f5e0c4ec8a308343ca90197f855e0e5876a696d5c55b350ccfdfa7680e447ab6be5f1bcbe6f010df50d76ef1aadb741c907bb5c52c13dc34adea492f43a788a37f92bd99f650d9dce93d9b00b059e0d48e25699bafb6f61a58aa683b6bbe03176cdf9cad35107825f5ae58c8c9b7b575ad16b570523831c23f540807f641baaf8925064b6bb07fc873cb4121d184a0a8e0033aae1012cfd5452d187123600fd72c520c9b6d60cb3cc70a66638c69b478a882c9d07fbb4c3654c7d1ed23059de6f296392d9910cd0f464bc6da6c45dbedf1521a8740ab292eca293c1669af88db30643ba44e10a68bad3a4d7b576f5d5bd65eee104f621b8c01db49f411f98af6262de3e0c5406ae000bb66997c1d14e78fc1a78c41bb9f4d15ddb18664268b6d4a460660a550a77fc31d1c48563f60fce32138ab485d8d32f029f85521a61b159208bd9e3e40a37b063046022fdb1eb63720f07e142f17d365c97e7d3ed6eec54597f3448b106eb8b9aead43473a5fd0d19bafcd9dc4d9cc6e35b544d7ec925b0a094b0d4330c561b3f599ac938745da46b9a1ac75c88dab4b020d6efc1a437341bf1a80c9c09a82515281546cc7534d10ed2cc8ef54d571de2dc8b17548a3e1a7c7bdaf743047970c0358b670ccf70f5778331f82fa07cbc7bc4f1a63adaab06ad47c4a0950f7cc13dbc99be3577bc0c3eed19694e6407d06fe763ce84fba832390f0b71b70fd6e0c8415e5f67a37a281f23efbd1126c5d805bb2fa4e2f7d0182dbfe6a3a80dcd31296451c4b385ff44b0c5730de86d99a7cc32cbea5e30cf88b87a9382ee0ba11b169b02f4a7d39d6f380a4456b2b95544c423236fa6cc55baea4c43dc7d0fbb692e89b78ce4de380b4439a41f3f6d93a6b647ab2add4df341b7b62e027f0b9ecc5628e7331bc9417014082153d8733900fea40279daaf82bb8508fe7bfe032da8a1120225e5fe7528cdf9342e27b68ce418fb3a9184a938ffd899117a1c064273b2834a8bacf06da4bbc075e4298267d0f08140f04e79167c811bc119bf041e5dc8b9c7ca439e87a9b268ee931b6c1ec8f6f3ddf06fc9cd73dada6c79440fd84496f273a11af9f2ac98f77c9f86117ae35be44a628bb2533c9744a865000a432824636da4d2dd58a0f4cc5c6f5473bb8b9d6c8fcf353955dbab20e549b405233f38c4a10871f5fe799c14b9199c27c16a03bf8fbc19a1771d6cf483a83d0672b4cffb3cac4adf3437481e7e134be9a1a8e717e3782a0a63918e55ee6d3e0462998583b6c1445e04cee6f2ff28419cbfab196244a37e66102b4efcbba6a100f767043ba47f7b8f017858e595487f13e5fa7f458736130d22ad1dbfe42b380febf113b5ed4192c18ceb01ab50539b41b4779d501814702c8a1ea24be511370efab8753725eac0cdfc61f47293a7d493b6ae24dbbac97374b6dd8334150872073d98b170594439ed398d653242bba42dbeb04fb97f0710d488b23faae713270b42f3af52c37f18185dfd6d3183d580f446dcc2cab681570e14056443bd21840061d9649479fbeafbf2ed1049ee6aef78e6bc99b4c33defe4a449f830e2a8e10f58be81d1d9ba10b550c1bcdfa1e957a2f8943f1ca0692e0629c9db6de063a3061f80fcf44cf33eb4387860f34d079682643ff175500490da4a2ed0d6c7d0380ce56f9d993c0e863526508e94f794b0c3cde156a91176d7672ca7795b98b9600595e6fd21b42aa2c4db2956c3035f22a90524d14cbb38860b939f319a79bf3205cef00c43c164855704e8c499ad444cacc42677fffa649a657d70c93af32582099816978913dd9b160bfede8cc6cc3426f09fac135637f0891902299336f2b30e26740b4b3f4b2dab3ad1aa2aa92690247acb936f429cc793b25015b62b7f840cd348c0fc56dacaaceb7186b6c74f0fbeb4d50ccefc1743da97f8d16c6e856e024fc6f31af212a598817d69bd75d85dc30d5b65f70ec584feed3317c8b451e70fe3ff3e06581d97dba1e4de14ece3326d32e83b54f39abb1b258f8d070f087204f197073a9d8ed8f842bb0961a1efbfdcb476b57c4912f1e709ba5932b01b44071f2de11457863e129816751bec666e1fc14b30a53b60423beb510f9120a17b08dd5e209eeabc9a7db126cc5d6724ece533edf9df556bcfc1684ceb23bdf7ca07cf1b0f00e59f442f1e056c04caf5aa53df07cf1d880e0a21c35a5740859e30041539bb0740ab7f97bb97db4020470d64e755b0c754e2e510245dbe7cc7af1804f37b05c9fb573516a16e910db10684356def3843f5bc8c7ff8a3dbdd5673a202c9e8ed88c5b38036adca110fa00a75adc341aa8f025e6267959e0eb7e238b4042e2dbd0dc97a1248e676bbdfbc480f68d2b699c2c57d48529d67a640187abc073f9aa723c638355e2ff2d3ec4aeb533bdd2118fa7eca68677ee19f18cf175608d9f079309be30383ff23e6391a18455e70881f064b898ba9737cde66cf24d20a7bdd725ce2d5d33b9219a3cbe6f2a4837fed7fd15642e7e6513eb8941170380c05b60c78b5bc79eccb6ee8ef70fb6597ceed6fae4eb60f0092500de96bef22002e445fe06428c445631ce9b1832f0234b7e618230b82471cb78d6885e45b480829e20170e8b8975b22a3cc2284cacdd0030c70791361721d22ccaab2ab7b8f059ba20865ec698e21b87a7d0ece9679a094239a96f7e409ebe3bc3058f1924601b2f32019244b8d7bd1296c201290be46d65dc033da831ae9864f0a5852ea4d028e8d46f851673063d8e45e5d82ff7c3504a06462c484c93cc6c72fbfa7bf6f0e799368895288346e976592c3d3ee74d0763e711a4185dacd6eef19d8666f9d02f04e6fffcc5d2e38e0d695035f95010ab15b40a396ddaf4276f1f2b1755351034ee10c1dd488ca18c5a4d328348b38a49ac05232aa954c27a7f67c0d741619061deeeba8c25da629780ab374f976f936cb60471b59762c27f721f37f9b41be00eb3fcfdd1eceb0ad3226b8f03d4526b73eba493960fc9649d4eefa89950258053e12254d829981cab8fd1c30de3a0f0fcc4e81618232c2feb174d3e91fd2560a4de1618b561375abf6e1ccf29ad03721e4d521ce454b0efcd09f5d0db14041077d0f0a5dce33711d1bbe4493fea8ec214abb3925b284e7668e0bd087a517ff074afdde8041b4b1fcec9d281f368ceb182a8eaf9c2e597682263e59dd153fe70079b942c770654be04f4b73cd04b06fb35ad82419cdd41e3c4e588cacec4db50dc0f50b6074996ee1607626a7ebd6982df97b6c70a4e568754f68fd1717480f06f2839776d961657971c0bff6837905e3f9655f18507ac2632667ee18feaa6a0da30b3bec2fc05b06cca5cf5457b63acc2c48f8f110622892f5b946e85234a60d0727f8ef5bc37bd9ba8a9fac722a212bc0332d5a08b0c1bd598705b994f3630b13779e6fccfea880c055c97d8e9f9a448b55dbb579630eab065c6b68adf8ae0da0c3b9cd48b5d3eeac070d39cb9ea1e30c25cb7e8593cbe7e313ec4c3c8e9e01c67d83be22ec8971184e385e1e4361a9ff9ed48185942e343f1eb500029eaf0397a7abf863996ef4839335253a3590b8a0fa037e43c2d06dd787a008fe21ef91d259a078a4b7b6660ce8432af76c255927c70616ea1ddf153564f5a9b5180cbc71b5e62c29c044600f8b56e33fb1df5c0937c6e1fc9abedb76551d7f2e61d02596df6a68a107f1bdf775c3e499d9c97dafeac116b2cd826f10f15d4ee605c55b46c0bef5e1b39954a54ae0c382035445f737f7a319add53751fb18b5d086a11f71aa265d33455358b3896d6145c3ba6c7389b8f42d02b2638458d69707ae72910b6a3f0cd13f5b9ecb0973bae7c7beefc6ea501b835f787a7820ecb6be122602f8101fbbde47c9ce985062b4d0ff971d890985dc1d86ce5bef7bb7911bed8b29c3610e93db040203f90e54ecd2e3ed8f24f5d14e836379c47f725ee2ce0dd4e042675c43fa5d177f67aad36416fbbf119764d291a14d54428e8689492ffb795631a0a8de8d16b9ef36e0bd91f0cbb47c07d10236e773820fa1f916e5dbaaeb5987d6ac3e21d5a367a5f8a97f3da98f52c85a0310d7e8b784eebd082f2e179e17285a1044f32cd780948f5122bdb564ec8bd069e77ee6c53ce7db2783c5947a9fca143006a6d52f281c9693b2edb7f48cee52cd46de16a5dedc0707275a1178709fe8107dc2f9ff3b6a198f77c5f5894c12748f23094d87436295ee5fd4d229fe721172535a1daafb3df5f56b30831d78cbd426cba43f6dd5617b83546da14a28e0f8e3954262a7b05c695eed84295c2af6b3079b69722f20b5814b180236c6925e8a6aa5bf03eeb7c6075e8d7f241634c2a4a567814b88ee81394194ef0b36170950e56d0e2dfb01bd7b37ed84db0cb012d13378b34d457d05802a320f2a743fbe3c8a9a8eb56312379f391b6ae3ffb1fb512467d9ce553801783e654772b95e005d84b027ac0c64d37baf751f92fe0f9c1eef302539c1f904fd3ac1238308417aa150de50ddeb3f0a1bafaf436d3d99c94a995417070d97d1b49ec2d910917dff83207eae2a6d5803c9b0ec61ab053d871d78e8d5cc520d63f3975e56c42b077646f1d116dc6ed805ccae5a545a81ed9383a64b8c1308bd397735d2479daf9a02486e32c16c001b9aa360c616a6f9f389dc477d4a04c28b5fab9dcad33f7052577a86b5df835f22786e3943b1b620f76457c9ff4d830151fdfa52d211c118c8c000f4eb6de4bff981fe43025f16ed0cec4f65c5a280f794270f867061f6a8da5c2dead1d5a40fee8b4952beab0d5d4abe6e2613adea46da3e2ff85527d7af54f96e6df5bb84b32a2a60b8740e4cac1f3cfc52d7f89caf74ac299b974fafbd8d47c4c1a6f91bf89cdd2f73789126057c83b23138309dd49dd2918a32660c18d8f18d59c33c66315f2117723135ad97a0eb95bc58a7282624ae43901fef54ed7560c16027ce4a09ff56d9766e9a06dd048a3c82190d9a8fb6e9b8a5d0c029d486920043bdec45bd3f0d0c3f71a634e8502466321d34f502a1079ecd6b56eb9dd8d0ee1597115b132b895a3becbb2b01967ba792978e63d7cc650ab1ca2e4934c01f8a089879d73d3f2a962f05316da41bc10147b1947fb966a2f90de6d468af9ec626c327796234897d4c42978cf4e46fdaf6c692d24cb7aa72f897aad3309d1794ba66caaf875cebcb6ac7b81c9088b7fae4d206eb6afe261488c3a092c6354b734f6dd71ce124527a6bd8f3415e76bd8ace063a1eb062a00ba8703d6a19ce4f1ed741a83f4c7f96d575c2e5cd3403c34468eb49c31a8ce28dabf2c0f09cbcb05433a58c8b75e98db409a4750590fee35cf9ddda63d2f64d17441b40ff6e8d15b62b92ae4de8a4be500b2ad79ad53940543a3fd49ca3d6055d0c9a5501f14467773cf8195bf2b06440b2be7581eda7c0799744809885babe08bf58eb9e2ed9617ee6d05195f7e361fe26d2994c84b3e3146ffc3575b09ca469b97fe2ebe0f10e593528bb1d0a416a7d1b5ca1f2eb3858606b512fa560d32d8bc41ebbe85add925fc52b7c546b5a85ac0078c21665e4127abf60e2ce3458211086322d13a1b48c2b2b9d5bff52840b944543251f286c5f439c172f5fa1022c7d900a327b7f54c8b28e84cb36d46be221a180e79e4f759b4dea6a73a2a6e2bea58876b2f33aa083c6d4e20078035652932d1bb1d5be222d1a35b2bdd2fcd2bc5e80e3931c3cbc48e0b4f3a5d7dbbe185864446dac5557d11766001a1066206006e99b143c8ece86c88c9b24977da1e58a0de380f655147ce67f6df154854374daa663f11ca3b6cb219e99f84a00a460ef7605fd495eec63ab4bb88b62db53094b793b1e4a234ad957237080a341262bff134983820b45aa5638ffd592a884e7c0068297ffa7d6316927b8a47e2a04ecf6db64a8b7471f113c43d871bd57a764a3ff228fffde9b2b10b4dd273ba15725c2823fff298b3d40a8064c46a88a2f9a324c4bdc21682768660a7754304f822d82a65410acc678b480a1d043091f952f10bc10539329f3ecd60e23277ae4a060509878a7e27f919dde210c585cdbdb491c0b609d37ebc3fa8b525f4ff2488c14832f3d6fb743407c368ed8b53991a1dff1f429561d6571bf42991560e554df83ba2be6a28c1c9d5ae2c3eaf4a6f67d0ae11e61ed6cee32a7f3ba1844b1863cedb25b81821b23150f774551792aaafecc3f0f505f430324bfbf3db43f5e8c568547eeace370772c90ea697f758ebdc8fe485e2cfdf97ca07db6fdac716affb6ca5c0964300966a3f3ceca0b42f659d7ffbfd405715d399bf8a963d9ebaa7e2c6bb9ce1c4b71ffa623fb098f1c89f2cb68621235205a576924b07b2feb74ce606bce77de5aefd97ec991a2cab27b78eabae0e8b307cb6d5e53dd2a70c0b15390c4100de930342b3ae4f09ada1902376bf6eb50c423b1646bd95761747895e42ec7c222fec2a91e6dd81c8684f0b98ae3564f9086c3740b3a065ec4438b04c871f31c766a71588109b15a83798467411dcf772542e891f3480e4a809e0c0a39e9ec046cf7969ede0bad87a1b2a34c1157bab7db6d6826b6b306c7f0bd07735ff9db74f8ca67ca61ecc3f2fbf99981417b90099b110fa8682807220d92dfd8d293c00ad7703c6ca68bfa73a26b0737da3030a52c10f2fafc75089b461c82a200f0f72e50d478a6493a19e4e8ee6801eb75171ed769406647fd00935dc84f85dc16452fd3e94a53e417d2004af8e27b82a62e13878f93bb27cc076603730aedc1803a8aa60629cd5c411daf9e5a485de7ec7d9f107efde3c8ab014eab73e9a20081bfaf4f58cb70d017fcd6b7f56d3f9c90bba3086f529e3d5c0912bd872694534d3901e31fae5c801db70f7d7b9f827b3bc474f39e7f2ed7a10485a5d2c35b96b80379689a7dac73852864996ecfa197a13f4b765c0634a2ff06568ed755821189a7510121d12afb1d664c4e692f90e1ae5abbe5eb1088ab65040796df39709520313c2ee71bdb99493f316cf0bbbe5acfc8c19ae16ff5f4e80b31a708396572da6c481404ec390b7af5166da593cc04b3b5717827556c178104aef5aadba5feff6841cdf89a180e5a48a4e3d9200f68979a3ee8d1f31b4a800bf2ef12e5af88cef7ad21283bc3dc888173943f3304908bec223e0d9a2da67a0ea86273738d34d36be0f7728f89a216f0c071178d6fe124653d84b8f94874420a6c76d33c874c6a3d2c1aaf0ec3c63db1477db108cdba9f044cb73e9db816870b58737959d480073a77227e5094a8d60794ab2ba1c87b69d3d076cb972154aa0e0eced5161322085ccff65bcd53498c1a71e6b1c98a0234dc343fb68bb40ff206a27e16b62543bea65348ea2524367d96dad4c28047fc3f5b36ff395dbacb370f259d4c87b5ef2feba0891704d6a10d5e844ae2f4e81632ffa50326c3ff13f10c909f5cd4372092c610c8e8e0a91866f2fc1ac89d7a6ad594d4dbfad1d6165d0845c77e6786d243c45efc6f2669f0bfcf2ede6f2693ad877ee17fc52cf3c386095389238ea5b2a968178de0b1b73a09adbaa0ec5df1944d58b7f0faa73f94ef02f6e9adfab77d8e40d149848347511e9381c7088b4079da4e9cbc5224d10e88019ae8efcff66643931d43385477b7c72dc8a83996b004f731b4e78302cadc6c08d82ad3ca7de5f8c5ddf1227fdfd3c9d269208ca9ff4dc6a655a321a945192d09eb2b03441004e978dcc8a021c6c8a61272c2d6e42779ffe70d4f6842d45acb0205098e6bb773f50ff7c4b843f8c9a32db65568bafbac1f7e8cd6d3a5a88f6a05db4888a0b8f05778eb063563ec922fca5e5f1c251fce767907ef713de19644047d7630e08d01b1e3dfde8bea06885487e3b40b4977f55373912c6e48c855f20e38ca50f572ecbe1529637a76a4f6a4e623a86dbdfa282248acd8fdb759177b06d94cd8e12af44a781eb3c5bb1acc163c3664e55413f9b590c1929b1cbe37e100f3aa28b5a5380989887524062d527cf31e5cb16804b55ca6decff52e8621960729605ca5cfb94c64851321d8b5206f35f31ab6480c0994ac1dd8637ea38ceb0b3eb7dc22a35a0db04234ad2d6389482d5cb466988d2ce3cb5080a5736a328d00a68d66bf6152672be6bbb58c1f08a6143181adfa90031bc789861e6f76cef4098885093e2a8b25f8b664bd608b5deac0d7829b1711cb6058698b22e42e2b5e0577a9a57d5a739b91fbf95a20e2029808c654f7651ccaa315266cd7e703604a070851fb6f43008dfe29630e8d80967b702913f037dcc3cfaaa37d01d26e69e508c3205273250c45f8e658d75863ea3fd44833b4002a39a93ee86255b127e85802ea3824f358cb9a118f3a1449d380623219acbf17c2ce027dce151562b42f3503e5814f83a6347a5854fe3cfd4b515ce652bb7ef3f03607c33d93d0a1e9b3530b90732868ff780a1ad9155ab8922fb9abd50022612899f5504e80a9367e7ec50d14045e1a762ed3a3effd7b54e65b7254c5bc527ff56027e6d605c99a25d0c506f3701adc70ce3c27b39e8c4b73e7284734c3f264afa466f7a73e4e73e9e5cc0ce3d12dcbacf3ee4bb67a2ed5442373a15f97f9fcf02dbb05e2f7f252bf5e900d215db2b302a581b9e58572600685dfc93b900ac7b4aab2356bdf30a78e97f806bb3c1227080d8989a0f2442405e5ead8cad144ad99b1bbcd8edcb86494fde8017a11869a02039b57b78285970604b38d98eeab586dcdd21f85cb10ee90160a0265cf1cf2e793072f4913d8b23f94fd9967c1360ead0fa083e9e8f5dc1ee4f60c4af8782fb898c33092ae3884004320d733bd79ae74a65680b394f5858221c906ad43942686d15ce48dbb6b0ae4ceea8f4feeb797df0a5855d000489bf760df0dbcafb3a4d63fec13376efdb9cae27072ea23c489936ef6ec66ee7bb72deb420880a3d79dab8f10dfedcec30f951c9cbaf1d85e8c49f577533ede6196f21b2f098db9317135f06a5b4edb2582058e7daaf0c1dafb1975ed29233c9e95698fbd082df885755b65ba005c7ae6e94d3050de7939528686d35dd2c9f48523e3315d027f5459207de3e381529fa2cc6aed71907547bf2f82cfe1abc3dcd43c686b0201a347ba45759422da97bd288c74c4d08d78e9a4779cb918ea50c8cfe5a869080a0716a81d35ffa38967474f1ed2c368df5a3e662a55d5e94d477144bdc51aae02056e14f43cdddc094218fa7156863b78027f585a164ec605c0a99c791f38940fe498d4d726d957c07759d80733ecca2a4d9961e3d1d5614eaa92f69e9a164f09a72230301b9274280acd3dd4253bf172d3aa048babe19b74d12bd0f5ac8b5a076dd154650860f0e63b2aeb95978413f9384815cf16ab6063e769ee9a3886bf01e915d8425c740744d542268cc2d698436596ada064aa04e4eee2e307290f3a0040b5f464b7571aefb127022c88c04e4cc2918bf15a4b91be79ba7dd9d162380c136deedcf3a2bfffe44a8c5d1facc23fe93a3fbcca6088469685b3f50041a701b476a1cea4d87d3b403d56edf7d43a48489ede1823372cd6ebf3f5e2b4190702b9b02629bdd5c40fe66b387aca2900baee5ea972c4607c0223357cdf0250fc020a7aa0567cee79731d216025e98a886324361b64eb398882c70cd5478de5640402f054189fda1e5214e583e672a7029b2d5cfaa5a30f7052a11e9b8ccf4dac0acce923a2c3714eb108ac013d4b818f8f8f38ce3423422d4b02dbef4846a0e4039ca283051fdb9637e28d32bcadd9afef83301e9a9b30be242529aaf30b613d02a9b7c75416c07f237acdfd1a6ffd4eab9eb6d512923d37aaf52d54a7104a5f03ef3a21f251693112d4a57372236b9ed480fd04e3701e7d92273068a42453d5044f75b798ea81020250580a9f55513b0f1b92d2d92105de82eb615ed30a26690b5a743ebe189ada7fe4eace55b803fe9f0a8c58e8667cdfbda9ca21f36a72ae07b8b574403b20026d4397b8e24fdb4d7e8b867289764ca634ac188565e37dd50f41cbfc569e9f5922d8299ef82fcdf92e8360a3c3649a666b017d416577963d0d90f41cc15b78825c12c3ba1654c5f8910119f3989c5bf06ef8fd309ca89a1f005f5c2dd6469f2cba25a5bc4db01351a6175cc18d199390475e22a36882f84a0365f23f9d0ba284205366d1028f375c1c0f2fd1decc62b3a358b996109607bb008093cc2b3761d5316849f05e8e2ca946e753796e159cb4965ea23014ed32c90d1f2f4117a2eb92316ef59aec0b290153e153dca83cf74f5327acc63d412d6001eb805a8a0230a6fdd64e0eaf596424117d11235cf69f283362297d46d8c6b607a6c9b00573fd4ff7a50e82e32ad6fce259886f704596dec959adc3cb12090d0fa86a83701bb7577c6dd6ed0ef623ecde3874c944a64a0af28d9397cc2dcbbb0abf4b73f98fddf66b692d2bae01dda3ac395fe39a6b1383d57a2196923b4ad505d250d0d46d3e7ab1d3200fdbc10ed44fc05b7ef7bb129c5bed28a35aa129b6002878bc82a502b6f9e1925fe1b3c45a9f6d98fd5a947ddf3572549d7972e93f02d443394603b1e4b23db01463d6485f53afeb7dd50bf9da49e8173cf5cfbe620a9c9269b6ae7519462186a76d2508f6d1af55ff7841c0ad5dda4fd00c5e876b08297aea79ea038d1722dfbbdc3d1e8cd8d10d8b404f5b46111555287ebfc96e0c333ccfe1391e8bb3fcc06ca3b6516e66b6412ea6c7f65280072db8d2412d5505819758841d98cbc2d17d71993beb4c095c0130f1c021fa45d25c2e2557e73f052055bb859b19af994cdebc8ba32c7988ad65574d47dc233e70c8e2416854ab09917a2cc2ed6a8e492189c8f01a4bcaf1bd18085e7fb0058e77de1fcbed81900c9b8b7d313d2f59682a3c1e1962743671e04b93285d5c7880ce9f790d73f3f008d1c2079d9604843047efe97f753c543f74ce95c08a7804e997aa752b6fd06304cbae7e56f2f7663572cf6d6428dd0e1016e6c73c3521a238e3400455a1cab50293aa8da07ceaa3fdf172659455683492733c1b558faa07ebc1cde6fb9bd17e07137be0ba0a0466e66166f917fc5df189c3f9cff3bcc09b4af528df1ce04d9a064eafce6665e1549505201eb4f4f1c05138d5b80151f9b5c1cff4c1028df9d5036a347e64baa685ccd772cf651d29ff1cda48438b4b1e4d66de0c740caa60810ffe1b70b394194f7b07b944af492b3b53c3c09236327cb7e08956939c0b2e810ef643274daaeaa229727715847e9382de1fb35d56e25cc188acf9d055a4d9eb090201436438e1185cfa8eb010702b70c67e2751f943ff27be1b71d8cb7931890547ff96113c187c7a3ebbf130432f7ed5f889aca14ed8d61170d303b999fe3c038bbad5474775a7a722ec6c567f3f705af59d304b516c66774005177f067fac0c10e28f355c009a87c2d7d327c1dd6606bd7c62cf9d3e9086764c8193a3a6c10cef63afe30553ea3f99365c9ec790055dd5e00c243e20fda8825e9b713de0dd0269ab8c74c88c36e0bd2965abe6aa484a4a6ab634012bebc7865f9a9a7090720e1d8be241f5bb86a27d5dc1346c1ec6530d708d7d743a04f3dcb3da15dfac1908a947d8568b6d0a80bc03420a4d49c80a91c96968eb384223fd5fdfbf045528080c4c1d188b0b5be650b3e8fd17de08efbd6aee4f393d73ac3937dc2a98bf020be7a085029dbba116508345f3029daa2d80a4cdeaaea1138292516d8044ad7203493b88b9c8543a94de42ed64f276f0dbb44b17d4949071df4b27b18cdb65e40b3be578291cf78bc4c4636fc9f7af511f6de1fc0087dcbac7037d3d8d242e050a019e5e28cf1e76da6079d13dc6430d52e3ffd30b88a5ff81763c947199c4190cee0ddf1838c6d6e9e82e0cbe9ea2d3bac4c13d1715a1bfa1563aef9d3d2b6609ada913bc0cc5adfcd3624fee04ae2bef21500d7fdd3af96fbabbf1b909550a03b2d0ceb0e885a83b29f14d421a03fca7561b05393ec15b12061987ef2ab5c60dbeba32dfcd548917b4617df364e41d799e475abdcd579b33ced588a8a5243108a76c3ed10d74b51d8e7ac308e6a83c158e4519e3dfa7128f187cbb88263ec50deb65c81d26d85a104baaf0c1fe825ccc6fe918edd317630d29f13f8f12b9cc0c04650b3794a8bbfebcf955826e0f058f76bdb95f8f0129b0e868109053dc2c03a5aec6126c3b5667ce8d48251e9fd6abb145170cd26a73f956eda9576bf35a04608bf8d2eb7b76718de9ba54030763a90d228e0304e4f1e3b78c656b5577fc00c556f03fef6fec8d0768c93017abcf8bdf81ab626aa6b6838735c0134e4ecde7506bd61c4471813528cd7d7e7446a7ccc59f02fd1856235ca070a8ad77f7a73be70933243e1e51c9b8942f4444002b2dc6050b18923bf7ce4d922c84c3ce49f7c1f5b99789d3c6d4e866591cab20cf4e71fa6345e4571e12891bfdcf1ecac1aaaea908236a9b2fa0bcc429a67198ff0194fa339125579cd8d9c56c7c3c3d27f66ff0c917ef5764787ba93d634afe48d46613b5ebea60dc57cb8299294e0ff45c1738230cc314a34af0600abd2dd94e98e8f2346cdafa1a0dd7a131808ae8260569cc63529c667e2aaf24a9d9c49f704e3abca7cfd3ff0657d2d1dc12cd55978780c78972233ec6c070227fc4026c7318a6af868fbf8499c8018a404ed1439b74c45b80295d4a4305060b17dcccb5d3514e67fbb69e23adc53e1a045156f9d38c3023f5b38bf821a5f60dce9b5f8f19b49268f893cc73f797286056c4edcab9d7bcb31b8c07743f3f850086446f814119f3a28a59078b13f2dc1845a11ad4424ab2febb23b67fe7c03b83b4b0450a1cfed1e510b761c06fa8b9b5f04646408e2b5e48e3400b5ed70818a33dce09dc07cedc4ef842e4d386718fabf1033a8cd3da1d63ce38191acdb88c8da4bb224159345139e642af065784257fa0a31dc6646a012107ec50b3744d4f11c3e6886e2bcb046a0474c2dfb7764e180103d86e7e5e37cc3326fbadfe9500bbc8156dad37d73578546a1e9dceb82e6ffab39b3f46bc8b182460738f2c4d63f7f3f3b6ae426938070939eb7c035f5b13c423b5cc9412ef764af131df0a85fe1e338352f0a7950c68b970f97f675a37370f49768a7c68a2339fce5377df72008425b81f3fef573be47bd83ada919310a51d0826df7a5f45c010d2c57701afa99a26c527bb13e8ee674cf634fcd65a6a417f922ba7a52e321e558e116a54f0ee94dcda59bc4e6558fa11161271245153f8f88165733149aee6993100f8111e77f2aa982bc76abd9eb435f82a135dc7776f5b07e95bd2204870b71421617fc1e0a729901f6454d3a5bbbb325bed0c949d2720ba824b30aea4d2075296568af2012887ae845a42846aadc402c1854a1d41e850c78fe17e9f7b456879765bfe2941dabbaf1d0a560d37f6a3fccdf20836db421f47b5ffad481d18530e6d9d83aea497bcec65f19d56eaafdaf57a2310aab8ef2713ebcc1e31815bd7407ee6eb38a0a19bd066c6b0c3b6a7afcf09d2075c0ac208ed132d9d68bd152cdb07a125d8ec6ccd08cc6b3f445e2fa3773e445967be2a78862a52c497c2a54a79a19f8a41a0aedf8e82ec1fc164032ac57620dadece6b8d7714bbd7a27bd7c15aed24ad01905010fafa927a19f2055d0fc2085e58cf0ff5c52ca787c771be4d31c2d299a74e37d64f858ecc087c5d293dc482d6025c4c395be3e200567577b1230506590bab5847b5129abd910cfc88ef5fdb4fda771faeb7d4a9bcc70c40698544e1133a9f90a91bcd13f842dc3be179b1ace6e8fdc361e96f4cbf0ca24e604a71f490f83bf21ff74c419c56d4eed32a96400d637fad41a30e2c366d4d797e5e4ffe7283f58301c5afbcbfa921d544d9ad6ac8f5030099ed80f27c252e633f4ccf2be02f300d1310ec5cf998dc533125c936c8c944822a2f97c4dfa716ada7d496d01706ce41e6b57324fc814b35c0b8f386ee1df6e87c07371713285454cb6294bb158359162b3f57b6f1e3294e2811b6c290f6043c8b96ea2e0050612aed8bca31ca1d4ad48e42487f536f0e2172e69eb23c8bcc7ef34a11f6427b22fa21d39e646459974ba6ba8cdc453765865a611592122ae99098a86a916d54d21139e6faf131eec839da62b662c5c517315efacf31eca85924b9641ed321945cec9663505f72151c529433230901334bb080ac15e8b2955aab0e6e1921f2a8d0274f99e5193c2be9e8e6164452a54f60a11dae385fff915203d28dc65307d2efdbe3224fa07439be11563c408f7aa1469c94e3f12090384b0c0085c07e6754f371df3ecedea00ac4ffe0bf31feaa750eda6c4da719b873b6b9725c83a9694fce2f9217a048e6b2a6788b3b47b719c2ac7f0f6d2454c5fdf4c860bf3de2198af943701d987c9a33d851b5323d3ff224ce2f0466918e4b74c356f152196520fb3dbde90382cd05d75a542b01ee5bdd159fec67954a0ceec5bba8259cbb3fdca759c50a7e640e1c06499c879eb38ad5786c17149768b25e9f86969e6216e6d5ca124f023607eaa9d3af05f2367a1ec0ca0e2ad4ee9a80c5a910878f150fa12ad60c3c4ed02b32f3c4ec1a5789956ecea1007efd95f266452ee20d0e7457deae6d1f20caf50b0952068f1fdf96e32aa4a77eca3c43cdc6d5436a189f89247409569ee9b5f7e3a57c87f08f6c1bcfe8442dcffa74c7b5d8bfa410cf984454a8ae9a388952ede286e198789f8ad1183ded5f7834431065ef19542189a9443984f5d791b5e9bf5f87647724e8f46bcccc138e224d2b843edc789546644d44be8cc60dc9ed1fac4aa6a45728c23a75ff2e21931a60f0b2d679bde682ed86ed6665e4103c0b4cde19738d5d5c6e05a7479b5058e8d7e327e3317bbbb2b026cd28ea1afc36fd78fd2246eb1446761d3a5700f2c5452be20e3b599c8aaab4387e998bb714a2261dd7f3b22bf60f66bfea45a8c9f15577cf2c56ab1e22a48082522910629aad81c9a781a5388a6ac78658fde0c1f319b9de72caee62b3dd030725202bf2d2231bf2113ba4e9fdd12208e63266c258e079dc9cb90df2e93bdd8385c55fce1082ad5ae77dcc3d6a83a68438cb2e59927639b25c5309c0279652a94df9eae06f557907bc963c4676544793e68008abe312e4b46d7bbcc23f1421ce17681ef576b7bc54a50fb87b1cab5d49910b0c86f7471de8c4cbac094b17121ab012fa0d05fcbeafac8551c988a55c79d43f28ff29ee63cdd94ef39816def1c50434ec8b035759775c4467dbd0e95d7612917b6e306e87dcd75dcd3ef3942ac74d2b694e07e7a96dc274347bcf1a6c13ad6f8469f328ed8816bb509faf48e085a34c4bc70893ca32aa98e786a86de1dae69adf5fab7d301a785d41dd37aabed18e583d9305b7920d55ae9a55c81629589bb0bec605819e7bef840ab688b86a1a0422f2710e1a795361236e12aceeae9deca85096b279373fa12803a4871a8acd35000261007b77fc0f885281315231662fb5a0f4ec8b0edd6b727a218aac259316edfdb903556b01eeffc42713b64dc3718391e8ae3c472594dee728a33595f5773a724108bdadb35054f8cd5da10d77b8d1dc30c1e6c9a55f0303f8c81cbb1d7fb3abc600cb95bbe5bffedbb48d0a44672ca5b814b421a74bab66869574efef4e8e3de70d49b44fcde504978f33a555f6076c2ea1ccb36998ce4bde37e0e7df9f7947c10ce4f60044ea9d3c893f773a73be45264c11a4cc2aeadcd11971125640c61f8d0367f38fb78e180e97f7cf3c145c2e8d76ca7a7f01f985160d0ce9b8980760d407909e8e076a3743dbb5afb0859985cd10dcfa33a83598611967b2d7f88c2b2400402fc11fe2b6dc26b072ff226eb3778144eac067acc2ce783c7ba58b767ad20c2550903c426363486c81bb0563156526d0c8f3f1ed5a0205b4fd1450ef72680a804eab2507401bbc07dee05301b48e97f608fb94af267e3230178e76eb9b800449fb8b4f77344b135a74a3ff92089f7cc7f740ec98b6a2e0386fe972d350780b9a420a446a8e94ca932c9dee22bf45b3c8d5f55c285f8365579d264b30db090d43c9b32a651bdf4820c6505ab61aa1702fd2066f696dce80df7c727fffb746053a7fa82a2e7be72c1dc38bc42f0a127a8fdb97fcaddc4bf6bc2c6d81a92c0806e3ab7d2e911e9cf438cfce3318121280fa44d4e0f7e4100d78984f70ae60a800c0afddc29b54ca304fb1c3379ca1cd6750708b6b45ea71fed8bd8186dfa6a30de9809f9c29b9ec4eaeaa73db0bc0c91c8b6c8586d4658de1c1befc820485b80b23f957031103cd7a5f633c0921e2eb9c8c1c9e480286d1910bd7ad68c60d3b0e8422bdf2fe831eaa0d2b2db5487fd7e07a2357891a7756e8325a9f11a5503602683f87508bdb6b293e8ac8845674a11a1623fc767caf6b19d9330bb43ec6c0014c6d919274f089f7687a3634e129f769a89ec8c2389c97fd75ef8065529d1d02ffa4c8abe9046817a3210a34eb93a226411b48a53dcd3ea0511885ffbc58830c"};
//TX_FROM_HEX(tx_hex);
//ADDR_VIEWKEY_FROM_STRING(addr_56Vbjcz, viewkey_56Vbjcz,
//network_type::STAGENET);
//// the ring members data from the above tx
////
//// this hex is obtained using onion explorer runnign with --enbale-as-hex flag
//// it is hex, serializied representation of of map of key_images
//// with corresponding ring members output_data_t info structure
//// we do this so that we just mack all the calls, instead of
//// accessing real blockchain for this data.
//string ring_member_data_hex {"011673657269616c697a6174696f6e3a3a61726368697665000000000102000000010800023063029583029fd703bf080103e0080103550d01033c0e0100000001070001a06161336635313965313630336463653035666163356566353764653236386339373465343639326638363666336330326636323933663037323061663966333733636538303030303030303030303030303065383030303030303030303030303462636234626232393930646537653663373364633163383866376262306262383663383734306261366231613862613834633837346363636434376166353701a03433353535393961363635306133636538376262653031323334363138393132313139623232646362663739346535643637316337393238666438343161616461313038303130303030303030303030363530383031303030303030303030303637303438333034333765363563306232613737653065376131373466633135613262643837646539393739613934633864306262316430303238383134383601a03836613733376230393864346330396233333130353261343565393665613234383236346131646563626130326238653237326538653831306236653731653661623563303130303030303030303030366635633031303030303030303030303535656464323031363832303730303866653833363838646161306233383561636233613339356537373638626439346239326538366438373331616233653601a06335373039643439653766303030656565633836323562323636326132666432303230633661616361373532663339303735623863343136386336333264376563623864303130303030303030303030386638643031303030303030303030303330626264303930663532323535643961353064653632396330663430323264663230373536383739306434383933303464366230646537323439396364386101a03861386338313762633664343635386133653134626534343365363539383439326134333463316533306431366532366265666161386365386633353861356330303030303030303030303030303030616638643031303030303030303030303232303138313962326335303939646633643661343432643038633633373762653037303032316562313663393134306434323266393237363366346261316201a06238393234323937393861633936383765613465623330353432366336373562363764306665646363346335343664386562363638643132336232353932646635643932303130303030303030303030323139323031303030303030303030303864303037396530663636366664373661393331333130306662363533393031383536346230363538363632646230633134636639643038636634373433373901a0386636643862666663623866333131323833663564646261303237353935363738313933636533313331653337336336333266613834323035613631333762353434393330313030303030303030303030383933303130303030303030303030366438303231386366306537363765623935306464653835373030393131363238346661616539616462663130303435383635353733633364653436613130610108000354020103870201030d060103320a0103dd0c0103470d0103550d010001070001a03832313462373765353366313466353461313931376365643235643138356333366232356537613033346265356161366164656530313262623637363566373036303837303130303030303030303030323438373031303030303030303030303030373435303066626331333364356564383934333965383263383463643838303235613664303130333035663566383634376537313464336235666166306101a06366643664643166646566633034323633636234356539353136393265353466363532366264646564353165626237313465383665653165393537353634633839333837303130303030303030303030353738373031303030303030303030306533363365633437353664643239623961363561373130646134323631653332616232323262386439396437303561656335626236663966633330366639336101a06335613331326437623835653665306330363438396563386531633535626439646236646632303135373063613363653435346137363430346137306539636531393862303130303030303030303030646438613031303030303030303030306439626565363835303063376331373961656335323330383162643164336137626535316530323433336630666564346539666265303734393332326639653001a06137626661396639393433396132656563633465666664383538666566643133623765356233313731643965346465666139663034363435386564326337326133633866303130303030303030303030303038663031303030303030303030303762303634363730626564666666386337623330346563396631313037633735616536623931656336653565323137393762393733326465303539383036663001a06539356462616462376231333463626265656466346531623439373338613636643330313761646334666437393333643961613962343135623865663436353030303030303030303030303030303030613939313031303030303030303030306365626361383634336661303936353632363939363564383136323838316535633365386663653738303261396334333330653233643839306136346432653601a03736383061643635313766613363323761613738326337663666363630393535373465646431353431373666356164383939623638613366336630646165343034663932303130303030303030303030313339323031303030303030303030306431666233323936633130373935613338326665323036643564376466316432316132656337376435373938646534653439623532666334353062396135356301a062383932343239373938616339363837656134656233303534323663363735623637643066656463633463353436643865623636386431323362323539326466356439323031303030303030303030303231393230313030303030303030303038643030373965306636363666643736613933313331303066623635333930313835363462303635383636326462306331346366396430386366343734333739"};
//MockGettingOutputs::ring_members_mock_map_t mock_ring_members_data;
//ASSERT_TRUE(xmreg::output_data_from_hex(ring_member_data_hex,
//mock_ring_members_data));
//MockGettingOutputs get_outputs(mock_ring_members_data);
//EXPECT_CALL(*cbs_mock, get_output_keys(_,_,_))
//.WillRepeatedly(Invoke(&get_outputs,
//&MockGettingOutputs
//::get_output_keys));
//xmreg::OutputInputIdentification oi {&address, &viewkey, &tx,
//tx_hash, is_tx_coinbase};
//xmreg::TxSearch::known_outputs_t known_outputs;
//ASSERT_TRUE(xmreg::check_and_adjust_path(known_outputs_csv_2_56bCoE));
//ASSERT_TRUE(xmreg::populate_known_outputs_from_csv(
//known_outputs_csv_2_56bCoE, known_outputs));
//oi.identify_outputs();
//EXPECT_EQ(oi.identified_outputs.size(), 1);
//EXPECT_EQ(oi.get_mixin_no(), 7);
//EXPECT_EQ(oi.total_received, 3296300490000ull);
//EXPECT_TRUE(oi.is_rct);
//oi.identify_inputs(known_outputs,
//cbs_mock.get());
//// numer of inputs is basically number
//// of all possible maches of our mixins.
//// this number is basically the number of
//// "output match?" strings - 1 in the explorer
//EXPECT_EQ(oi.identified_inputs.size(), 2);
//uint64_t found_input_amounts {0};
//for (auto& in_info: oi.identified_inputs)
//found_input_amounts += in_info.amount;
//EXPECT_EQ(found_input_amounts, 103312985270000ull);
//// check when get_output_returns returns false
//EXPECT_CALL(*cbs_mock, get_output_keys(_,_,_))
//.WillRepeatedly(Return(false));
//xmreg::OutputInputIdentification oi2 {&address, &viewkey, &tx,
//tx_hash, is_tx_coinbase};
//oi2.identify_inputs(known_outputs,
//cbs_mock.get());
//EXPECT_EQ(oi2.identified_inputs.size(), 0);
//}
//TEST_F(OUTPUTIDENT_TEST, IncomingPreRingctCoinbaseTransaction)
//{
//// private testnet tx_hash af9652cb7682d0b73d4ec588d3d17b5ebfe4773dbb69228fa716242a223fdec0
//string tx_hex {"01f20201ffb60206a4fa8cd60302225670b42320e616c5c7b801a09b4414456a608808b3f712378d90c4a0bd38cd80f882ad1602137972ff6725442bae4f92d6640e2a8036b1c5652afdbe5439789f3c584ef40b80c0fc82aa0202befb33d6df13977c325dc548022a401c37c024dbd88e244bc6825418f8994df78090cad2c60e02e1b0c0394f0652e13f471b422eeb092acb245d5fc679759ca66667ce179f478c80e08d84ddcb010292ed8812901ad9fac78390e008141ebad73a30af51178915de6e1586239a121980c0caf384a302028134f3543a21a2a78dbd2629e47601accd4f703e0b402f07213cffae2d592ab2210169aa02bef903707e96e7591cf9117879ce456b27d44cd0b70ef6d90636f040bd"};
//// the tx has six outputs for 10 xmr, so we check
//// if we can identify it.
//TX_FROM_HEX(tx_hex);
//ADDR_VIEWKEY_FROM_STRING(addr_9wq79, viewkey_9wq79, net_type);
//xmreg::OutputInputIdentification oi {&address, &viewkey, &tx,
//tx_hash, is_tx_coinbase};
//oi.identify_outputs();
//EXPECT_EQ(oi.identified_outputs.size(), 6);
//EXPECT_EQ(oi.identified_inputs.size(), 0);
//EXPECT_EQ(oi.total_received, 17586985873700ull);
//EXPECT_TRUE(oi.tx_is_coinbase);
//EXPECT_EQ(pod_to_hex(oi.identified_outputs[0].pub_key),
//"225670b42320e616c5c7b801a09b4414456a608808b3f712378d90c4a0bd38cd");
//EXPECT_EQ(pod_to_hex(oi.identified_outputs.back().pub_key),
//"8134f3543a21a2a78dbd2629e47601accd4f703e0b402f07213cffae2d592ab2");
//}
//class TXSEARCH_TEST : public ::testing::TestWithParam<network_type>
//{
//public:
//static void
//SetUpTestCase()
//{
//string config_path {"../config/config.json"};
//config_json = xmreg::BlockchainSetup::read_config(config_path);
//}
//protected:
//virtual void
//SetUp()
//{
//net_type = GetParam();
//bc_setup = xmreg::BlockchainSetup {
//net_type, do_not_relay, config_json};
//mcore = std::make_unique<MockMicroCore>();
//mcore_ptr = mcore.get();
//rpc = std::make_unique<MockRPCCalls>("dummy deamon url");
//rpc_ptr = rpc.get();
//tp = std::make_unique<TP::ThreadPool>();
//tp_ptr = tp.get();
//bcs = std::make_unique<xmreg::CurrentBlockchainStatus>(
//bc_setup, std::move(mcore), std::move(rpc),
//std::move(tp));
//}
//network_type net_type {network_type::STAGENET};
//bool do_not_relay {false};
//xmreg::BlockchainSetup bc_setup;
//std::unique_ptr<MockMicroCore> mcore;
//std::unique_ptr<MockRPCCalls> rpc;
//std::unique_ptr<xmreg::CurrentBlockchainStatus> bcs;
//std::unique_ptr<TP::ThreadPool> tp;
//MockMicroCore* mcore_ptr;
//MockRPCCalls* rpc_ptr;
//TP::ThreadPool* tp_ptr;
//static json config_json;
//};
//json TXSEARCH_TEST::config_json;
}