From 68b0d7bc20b8b5ef161badce3d8e6d35fa83a25f Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Mon, 9 Oct 2017 13:51:10 +0200 Subject: [PATCH 01/37] Remove unnecessary lexical_cast include. --- src/rpcblockchain.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 928335881b..35a21e9bf7 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -17,7 +17,6 @@ #include #include -#include #include // for to_lower() #include #include From 6c22687f6e280f98a5d96b1f31079f589c6b7ad1 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Mon, 9 Oct 2017 13:53:34 +0200 Subject: [PATCH 02/37] Remove cdbl forwards. --- src/rpcblockchain.cpp | 1 - src/wallet.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 35a21e9bf7..2cf5574739 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -142,7 +142,6 @@ extern Array MagnitudeReportCSV(bool detail); std::string getfilecontents(std::string filename); int CreateRestorePoint(); int DownloadBlocks(); -double cdbl(std::string s, int place); double LederstrumpfMagnitude2(double mag,int64_t locktime); bool IsCPIDValidv2(MiningCPID& mc, int height); std::string RetrieveMd5(std::string s1); diff --git a/src/wallet.cpp b/src/wallet.cpp index 313c83edea..926e6a4f60 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -22,7 +22,6 @@ using namespace std; -double cdbl(std::string s, int place); std::string SendReward(std::string sAddress, int64_t nAmount); extern double MintLimiter(double PORDiff,int64_t RSA_WEIGHT,std::string cpid,int64_t locktime); int64_t GetRSAWeightByCPID(std::string cpid); From a84ca51eb16b87b25a0d8a530023684c72d1bdf0 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Mon, 9 Oct 2017 13:58:37 +0200 Subject: [PATCH 03/37] Newline normalization. --- src/test/block_tests.cpp | 140 +++++++++++++++++++-------------------- src/test/cpid_tests.cpp | 34 +++++----- 2 files changed, 87 insertions(+), 87 deletions(-) diff --git a/src/test/block_tests.cpp b/src/test/block_tests.cpp index 15899e9411..9ef2b27f31 100755 --- a/src/test/block_tests.cpp +++ b/src/test/block_tests.cpp @@ -1,70 +1,70 @@ -#include "main.h" -#include "block.h" - -#include -#include -#include - -namespace -{ - template - class BlockChain - { - public: - BlockChain() - { - // Initialize block link. - for(auto block = blocks.begin(); block != blocks.end(); ++block) - { - CBlockIndex& prev = *std::prev(block); - CBlockIndex& next = *std::next(block); - if(block != &blocks.front()) - { - block->pprev = &prev; - block->nHeight = prev.nHeight + 1; - } - if(block != &blocks.back()) - block->pnext = &next; - } - - // Setup global variables. - pindexBest = &blocks.back(); - pindexGenesisBlock = &blocks.front(); - nBestHeight = blocks.back().nHeight; - } - - std::array blocks; - }; -} - -BOOST_AUTO_TEST_SUITE(block_tests); - -BOOST_AUTO_TEST_CASE(FindBlockInNormalChainShouldWork) -{ - BlockChain<100> chain; - BlockFinder finder; - - for(auto& block : chain.blocks) - BOOST_CHECK_EQUAL(&block, finder.FindByHeight(block.nHeight)); -} - -BOOST_AUTO_TEST_CASE(FindBlockAboveHighestHeightShouldReturnHighestBlock) -{ - BlockChain<100> chain; - BlockFinder finder; - - CBlockIndex& last = chain.blocks.back(); - BOOST_CHECK_EQUAL(&last, finder.FindByHeight(101)); -} - -BOOST_AUTO_TEST_CASE(FindBlockByHeightShouldWorkOnChainsWithJustOneBlock) -{ - BlockChain<1> chain; - BlockFinder finder; - - BOOST_CHECK_EQUAL(&chain.blocks.front(), finder.FindByHeight(0)); - BOOST_CHECK_EQUAL(&chain.blocks.front(), finder.FindByHeight(1)); - BOOST_CHECK_EQUAL(&chain.blocks.front(), finder.FindByHeight(-1)); -} - -BOOST_AUTO_TEST_SUITE_END() +#include "main.h" +#include "block.h" + +#include +#include +#include + +namespace +{ + template + class BlockChain + { + public: + BlockChain() + { + // Initialize block link. + for(auto block = blocks.begin(); block != blocks.end(); ++block) + { + CBlockIndex& prev = *std::prev(block); + CBlockIndex& next = *std::next(block); + if(block != &blocks.front()) + { + block->pprev = &prev; + block->nHeight = prev.nHeight + 1; + } + if(block != &blocks.back()) + block->pnext = &next; + } + + // Setup global variables. + pindexBest = &blocks.back(); + pindexGenesisBlock = &blocks.front(); + nBestHeight = blocks.back().nHeight; + } + + std::array blocks; + }; +} + +BOOST_AUTO_TEST_SUITE(block_tests); + +BOOST_AUTO_TEST_CASE(FindBlockInNormalChainShouldWork) +{ + BlockChain<100> chain; + BlockFinder finder; + + for(auto& block : chain.blocks) + BOOST_CHECK_EQUAL(&block, finder.FindByHeight(block.nHeight)); +} + +BOOST_AUTO_TEST_CASE(FindBlockAboveHighestHeightShouldReturnHighestBlock) +{ + BlockChain<100> chain; + BlockFinder finder; + + CBlockIndex& last = chain.blocks.back(); + BOOST_CHECK_EQUAL(&last, finder.FindByHeight(101)); +} + +BOOST_AUTO_TEST_CASE(FindBlockByHeightShouldWorkOnChainsWithJustOneBlock) +{ + BlockChain<1> chain; + BlockFinder finder; + + BOOST_CHECK_EQUAL(&chain.blocks.front(), finder.FindByHeight(0)); + BOOST_CHECK_EQUAL(&chain.blocks.front(), finder.FindByHeight(1)); + BOOST_CHECK_EQUAL(&chain.blocks.front(), finder.FindByHeight(-1)); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/cpid_tests.cpp b/src/test/cpid_tests.cpp index 925e8b99c0..d98e8c1de1 100755 --- a/src/test/cpid_tests.cpp +++ b/src/test/cpid_tests.cpp @@ -1,17 +1,17 @@ -#include "cpid.h" - -#include - -BOOST_AUTO_TEST_SUITE(cpid_tests); - -#include - -BOOST_AUTO_TEST_CASE(cpid_VerifyComputeCPIDv2) -{ - uint256 blockhash = 1; - BOOST_CHECK_EQUAL( - ComputeCPIDv2("test@unittest.com", "abcdefghijklmno", blockhash), - "4078bd252856710b95c4f31377bb1ba86bc3666ac7676a706e736ece7176d4756a7b76417ad36cd97a6976d78fc5d0d2"); -} - -BOOST_AUTO_TEST_SUITE_END() +#include "cpid.h" + +#include + +BOOST_AUTO_TEST_SUITE(cpid_tests); + +#include + +BOOST_AUTO_TEST_CASE(cpid_VerifyComputeCPIDv2) +{ + uint256 blockhash = 1; + BOOST_CHECK_EQUAL( + ComputeCPIDv2("test@unittest.com", "abcdefghijklmno", blockhash), + "4078bd252856710b95c4f31377bb1ba86bc3666ac7676a706e736ece7176d4756a7b76417ad36cd97a6976d78fc5d0d2"); +} + +BOOST_AUTO_TEST_SUITE_END() From f91355b832fba6defd71e5c65a2e439182acb7d2 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Wed, 11 Oct 2017 08:54:12 +0200 Subject: [PATCH 04/37] Replace cdbl implementation with atof+round. I checked 22 million cdbl calls while syncing and none of them required cleaning. The new implementation uses 18% of the execution time compared to the old one. This is negligleble on modern hardware, but an old Raspbeery Pi should see a greater boost. --- src/main.cpp | 16 +--------------- src/test/gridcoin_tests.cpp | 8 ++++++-- 2 files changed, 7 insertions(+), 17 deletions(-) mode change 100644 => 100755 src/test/gridcoin_tests.cpp diff --git a/src/main.cpp b/src/main.cpp index 5664c5af51..e5fc1c3be4 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,7 +23,6 @@ #include "miner.h" #include "backup.h" -#include #include #include #include @@ -4973,22 +4972,9 @@ std::string RetrieveMd5(std::string s1) } } - double cdbl(std::string s, int place) { - if (s=="") s="0"; - s = strReplace(s,"\r",""); - s = strReplace(s,"\n",""); - s = strReplace(s,"a",""); - s = strReplace(s,"a",""); - s = strReplace(s,"b",""); - s = strReplace(s,"c",""); - s = strReplace(s,"d",""); - s = strReplace(s,"e",""); - s = strReplace(s,"f",""); - double r = lexical_cast(s); - double d = Round(r,place); - return d; + return Round(atof(s.c_str()), place); } diff --git a/src/test/gridcoin_tests.cpp b/src/test/gridcoin_tests.cpp old mode 100644 new mode 100755 index 8132e1e9d0..90d156b013 --- a/src/test/gridcoin_tests.cpp +++ b/src/test/gridcoin_tests.cpp @@ -16,6 +16,7 @@ extern std::string UnpackBinarySuperblock(std::string sBlock); extern std::string ConvertHexToBin(std::string a); extern std::string ConvertBinToHex(std::string a); extern bool fTestNet; +double cdbl(std::string s, int place); namespace { @@ -74,13 +75,11 @@ BOOST_AUTO_TEST_CASE(gridcoin_GetOutstandingAmountOwedShouldReturnCorrectSum) BOOST_AUTO_TEST_CASE(gridcoin_VerifyGetQuorumHash) { const std::string contract = "0390450eff5f5cd6d7a7d95a6d898d8d,1480;1878ecb566ac8e62beb7d141e1922460,6.25;1963a6f109ea770c195a0e1afacd2eba,70;285ff8d5014ef73cc83580338a9c0345,820;46f64d69eb8c5ee9cd24178b589af83f,12.5;0,15;4f0fecd04be3a74c46aa9678f780d028,750;55cd02be28521073d367f7ca38615682,720;58e565221db80d168621187c36c26c3e,12.5;59900fe7ef44fe33aa2afdf98301ec1c,530;5a094d7d93f6d6370e78a2ac8c008407,1400;0,15;7d0d73fe026d66fd4ab8d5d8da32a611,84000;8cfe9864e18db32a334b7de997f5a4f2,35;8f2a530cf6f73647af4c680c3471ea65,90;96c18bb4a02d15c90224a7138a540cf7,4520;9b67756a05f76842de1e88226b79deb9,0;9ce6f19e20f69790601c9bf9c0b03928,3.75;9ff2b091f67327b7d8e5b75fb5337514,310;a7a537ff8ad4d8fff4b3dad444e681ef,0;a914eba952be5dfcf73d926b508fd5fa,6720;d5924e4750f0f1c1c97b9635914afb9e,0;db250f4451dc39632e52e157f034316d,5;e7f90818e3e87c0bbefe83ad3cfe27e1,13500;btc,0;grc,0;amicable numbers,536000,5900000;asteroids@home,158666.67,793333.33;citizen science grid,575333.33,2881428.57;collatz conjecture,4027142.86,36286380;cosmology@home,47000,282666.67;einstein@home,435333.33,5661428.57;gpugrid,1804285.71,9035714.29;leiden classical,2080,10500;lhc@home classic,26166.67,210000;milkyway@home,2094285.71,8395714.29;moowrap,996666.67,7981428.57;nfs@home,96000,385333.33;numberfields@home,89333.33,626666.67;primegrid,248000,1735714.29;seti@home,52333.33,367333.33;srbase,89666.67,896666.67;sztaki desktop grid,8320,41666.67;theskynet pogs,45500,409333.33;tn-grid,39500,514666.67;universe@home,47833.33,335333.33;vgtu project@home,20666.67,124000;world community grid,29166.67,263333.33;yafu,93000,838666.67;yoyo@home,7040,56333.33;NeuralNetwork,2000000,20000000;"; - //const std::string contract = "0390450eff5f5cd6d7a7d95a6d898d8d,1480;1878ecb566ac8e62beb7d141e1922460,5;1963a6f109ea770c195a0e1afacd2eba,80;285ff8d5014ef73cc83580338a9c0345,780;46f64d69eb8c5ee9cd24178b589af83f,11.25;0,15;4f0fecd04be3a74c46aa9678f780d028,580;55cd02be28521073d367f7ca38615682,780;58e565221db80d168621187c36c26c3e,12.5;59900fe7ef44fe33aa2afdf98301ec1c,530;5a094d7d93f6d6370e78a2ac8c008407,1200;0,15;7d0d73fe026d66fd4ab8d5d8da32a611,80666.67;8cfe9864e18db32a334b7de997f5a4f2,30;8f2a530cf6f73647af4c680c3471ea65,70;96c18bb4a02d15c90224a7138a540cf7,4560;0,15;9ce6f19e20f69790601c9bf9c0b03928,3.75;9ff2b091f67327b7d8e5b75fb5337514,235;a7a537ff8ad4d8fff4b3dad444e681ef,0;a914eba952be5dfcf73d926b508fd5fa,10166.67;0,15;db250f4451dc39632e52e157f034316d,3.75;e7f90818e3e87c0bbefe83ad3cfe27e1,13666.67;f46d4755f17cfaed68bf7af707b1731e,21.25;btc,0;grc,0;amicable numbers,640666.67,7054285.71;asteroids@home,161333.33,809333.33;citizen science grid,587333.33,2944285.71;collatz conjecture,4391428.57,39564960;cosmology@home,43666.67,306000;einstein@home,464000,6498571.43;gpugrid,1377142.86,6897142.86;leiden classical,1560,9280;lhc@home classic,34500,276000;milkyway@home,2237142.86,8970000;moowrap,1105714.29,8858571.43;nfs@home,106666.67,428000;numberfields@home,117333.33,704666.67;primegrid,320666.67,1927142.86;seti@home,50000,401333.33;srbase,93333.33,932666.67;sztaki desktop grid,7920,39666.67;theskynet pogs,48166.67,434666.67;tn-grid,43500,522666.67;universe@home,54666.67,384000;vgtu project@home,21000,126000;world community grid,30000,270666.67;yafu,100000,901333.33;yoyo@home,7640,53666.67;NeuralNetwork,2000000,20000000;"; BOOST_CHECK_EQUAL(GetQuorumHash(contract), "0f099cab261bb562ff553f3b9c7bf942"); } BOOST_AUTO_TEST_CASE(gridcoin_QuorumHashShouldBeCorrectAfterPackingAndUnpackingBinarySuperblock) { - //const std::string contract = "0390450eff5f5cd6d7a7d95a6d898d8d,1480;1878ecb566ac8e62beb7d141e1922460,6.25;1963a6f109ea770c195a0e1afacd2eba,70;285ff8d5014ef73cc83580338a9c0345,820;46f64d69eb8c5ee9cd24178b589af83f,12.5;0,15;4f0fecd04be3a74c46aa9678f780d028,750;55cd02be28521073d367f7ca38615682,720;58e565221db80d168621187c36c26c3e,12.5;59900fe7ef44fe33aa2afdf98301ec1c,530;5a094d7d93f6d6370e78a2ac8c008407,1400;0,15;7d0d73fe026d66fd4ab8d5d8da32a611,84000;8cfe9864e18db32a334b7de997f5a4f2,35;8f2a530cf6f73647af4c680c3471ea65,90;96c18bb4a02d15c90224a7138a540cf7,4520;9b67756a05f76842de1e88226b79deb9,0;9ce6f19e20f69790601c9bf9c0b03928,3.75;9ff2b091f67327b7d8e5b75fb5337514,310;a7a537ff8ad4d8fff4b3dad444e681ef,0;a914eba952be5dfcf73d926b508fd5fa,6720;d5924e4750f0f1c1c97b9635914afb9e,0;db250f4451dc39632e52e157f034316d,5;e7f90818e3e87c0bbefe83ad3cfe27e1,13500;btc,0;grc,0;amicable numbers,536000,5900000;asteroids@home,158666.67,793333.33;citizen science grid,575333.33,2881428.57;collatz conjecture,4027142.86,36286380;cosmology@home,47000,282666.67;einstein@home,435333.33,5661428.57;gpugrid,1804285.71,9035714.29;leiden classical,2080,10500;lhc@home classic,26166.67,210000;milkyway@home,2094285.71,8395714.29;moowrap,996666.67,7981428.57;nfs@home,96000,385333.33;numberfields@home,89333.33,626666.67;primegrid,248000,1735714.29;seti@home,52333.33,367333.33;srbase,89666.67,896666.67;sztaki desktop grid,8320,41666.67;theskynet pogs,45500,409333.33;tn-grid,39500,514666.67;universe@home,47833.33,335333.33;vgtu project@home,20666.67,124000;world community grid,29166.67,263333.33;yafu,93000,838666.67;yoyo@home,7040,56333.33;NeuralNetwork,2000000,20000000;"; const std::string contract = "002a9d6f3832d0b0028606d907e09d97,1.25;002d383a19b63d698a3201793e7e3750,23.75;004167638daf46847501be39de7e941b,15;0,50;00565aba8b273e72f5292dd54c2e9d9c,40;0,50;007b76793e25af64dc29d68b5347ee7f,20;0,50;0097ab486cc2b1fb01e021880475c643,6.25;009b415d69801a2f9182069b9257f410,3.75;00bcd811d3f0ba9970189c7ffcb1f727,1.25;00d9943ffbcc671b79aec7d94a995bf7,3.75;00f6f068e6c7845b3433b6991980cc61,0;0,50;012bdc173281b093a4cd02543bcb52d2,12.5;0,50;014135e5cb2ebf8f283d1d1655151287,1.25;0,50;015baf274dd9265b1c53d6aa064cface,500;015bdd896fd7e0394d5148e93da2f7de,45;01656b71853d1d6b1a0f7e8795d1b9e8,3.75;0,50;0,50;0180d21299ca17267b6cf734c9d05884,510;019308d689c4253e8aea48522b9fa152,1.25;0,50;0,50;01a499929b07373568b3eea3b3afe75e,12.5;0,50;01d3236e6b82f009596aa791e805e363,0;01d77694989d3af771ee2c2bc3cdb41b,80;01df9a46fb210ed7b31222b386a0e97b,8.75;01f02f022cabcea12e899ce858d51b95,2.5;01f7a0f8b60fe3ebd799122ebe08043e,50;01f9b2b8cce2c8b3320d815303f47025,1.25;01fd21141ef10ad826c5b6d7d7a66629,405;0221c3feb81bf9e73d820036fbf02a96,1.25;0,50;0244d21e3dc2a743529f93b8dc3316d1,11.25;0249b19d285e6b0b6c7d255974aefed1,35;0252e7c76355a745a1f45c7b0ce56052,1.25;02615d216000305ab091eee9bc616596,0;026966c69d668fb625df0b9809725f6c,8.75;0,50;02c5e80c85f21c51808035782766bf5e,25;02cef20033aa7469d01768f7d0b187ff,1.25;02dab202fc1bc7b8ef61b4ecfccb0b38,1.25;02e08427b129719f838e775fc8be22a2,6.25;02e6d3a8e3e27f1a59cb3e878e91447c,0;0329499417b91f3bf4da6c6ea9a1fd4a,0;0343b16b6d8c24e0c098b88ddae39a2b,17.5;034685fbbaccefea46bbf6b7b1ca1e38,5;03579240e86ff48f2176cad62e2bfa87,15;0371fb3bb416365874cdd31b5795c88c,7.5;03735fd8066b71828aec7ce17196bbb8,10;0,50;0390450eff5f5cd6d7a7d95a6d898d8d,380;0391ab418c82b05f664677e48abc1431,1.25;0,50;03c54d4a58c58a9914f36d82e7525ae7,0;03d010e04bfa7db3852308300a800d94,60;03f0850806e44e8eba363a790659ee5b,0;04063bfc4e067c007fe3db1374768e27,1.25;041e0951f9c3ece0d0ba4d1293e40d2c,0;0,50;04595c27d2b65393a238509e074c0af6,1.25;0485d70830c06b568677a12780985949,0;0,50;049144b3fb2e414f5d122a2807066342,30;04a6fe7a851bcdcad7753ce170eecd3f,530;04cf70d914c9e8c816edeb04bb64324b,1.25;051ab27a3dc0a98cab388973e9063cf9,2.5;052456468d53290a0cdcc1dbde9181f7,3.75;0,50;05b2d0f351cd1814b238e16201077b42,0;0,50;05c21278af7999e749b1671ea90bc8f6,145;05d490b8097437b9d6c7d6367026c0e6,0;05dea7e23a009cf981933d090838ce22,190;0,50;0610f6d62e54d240fe0f839daad9b3f1,5;062c68c850bf90dd52f1d1aeff927d85,1.25;0639224a79ad5696557a66bd2cda41b4,1.25;0639771c67d7f228d327c2984b465560,3.75;0648646de5bd1f3523bc0d82561c730d,150;0,50;067bc227ca534998a56ec56c1f865e14,5;06b4562fecdba1ea9a774210ec7ce410,6.25;0,50;06c52d8ad2ce85b970137e39386cd4c4,0;06d27880de211dad1e38d69306598849,5;07065b315ac186d42fbe2e5ef734b7cb,20;0,50;0721d0b89f5af66c996932cf2e8ffc4a,0;07733c4b62bb81984fce796da92f0ad6,0;079f09b14b5a8bf3ae773340d9a54f82,2.5;07eddf7186858e6e44ba714cfad8578b,50;08321f22a670ce593f85cee0aceed378,1.25;0,50;0879a1c1019d04035193b8a2b948dcf5,5;087d11dd7e5b78fa3d3345e2819ebdb5,0;0,50;08af9c2edb34a9e4fefa9d0493fe522b,23.75;08faa06648215a402944e0d109a0e0d7,55;09163872b8088a4e9345adab66272304,2.5;091dffc765df88d341813c908b2b6062,3.75;091e576772dc5bae020f887c1f9fbfed,80;091e9ff7a5d9c34d4bb8b49e2bcb7bf8,1.25;093f34e6da5a3322b196d675243938f4,6.25;0953b57bdfb229d8a2cbb53c3bba78ca,5;0968f3f73c358da2dd8b4854e1ede35e,35;09696d66b271b84cfb2e7d2dfb1e044d,13.75;097c16fed6eba410219b5f52f954f5b0,1.25;09a99d4daf6801965cec61aa058c2062,1.25;09cb4cd605d6114265e185ca273123f9,10;09d2afaeb77938028de93d7e55844f55,0;0a187954d623c6bdd7799206d578935b,90;0,50;0a253e023f00417e3be21157c46a186c,1.25;0a2e83abb0b94b61a064ca4e693992ae,7.5;0a49adb03a2c93c914de7bfdf7ea1187,0;0a7f19e446a766dc045f7c39cebd508a,15;0a8d1a37461e99c2d61702857502493f,40;0aac95f4d6361b3a3bcf16eac5185a04,16.25;0ad644e2fee34d5e603d76c1678efb66,2.5;0ae6cb0c3b49ab3148f24dd890c76e12,100;0b3e9507b7e91d1ae13ca41262fee609,175;0b44c45c75607eee4c14cd71e9d7aeff,16.25;0b5ef259411ec18e8dac2be0b732fd23,80;0,50;0,50;0b994a7810d0dd2365e4cc898bb2f4c5,200;0bd0e69ef4973bdf9fed2cadb35815fe,1.25;0bf4d63e995d2b75d6b7d3d5b0fa9ac5,1.25;0c130640a79aab9f1eaed36277bc51fc,3480;0c214883c0b26b5ebfa4c9d5580b6f7c,10;0c795e2af37411d8c917822318408a46,16.25;0c7b77538a622713c80e7f8c686c02c9,1.25;0c8916c4698f55e64f2ebfdd8f0b06b2,1.25;0c99c1b399dc935978e2ad69b7f076da,100;0,50;0cd7082d3d231f5b24adc4843103f44a,65;0cec3b20e30830a7e44c38763e664987,95;0,50;0d018ee5353d349283563373d87ca680,45;0d213c18c51e00b5e76df2792f817f1c,0;0d25359c92b351cd3e7a60f79e9dd7d6,12.5;0d7bf78aeb1dae402525a417a38b07e4,25;0,50;0db1531f46733c6ef5e80fd6aeb9a9f6,18.75;0dc52ada952375686387379f3396a362,5;0de87e305d5d3a9cd58bde8a9f84339b,325;0ded68f4f2e69faf653e5ca9907038d2,10;0e2316e4045610d60c9d84531609a156,2.5;0e2ad09c8a0b450470825376aca24987,10;0,50;0,50;0e4f2209abcd450e225cee00a56202b0,3.75;0,50;0,50;0e807af5a446e8ad0e1339b00aed5736,45;0e8f88f0e8109cdce2b348c07226513c,12.5;0ea4ec2335db563b75502bfeaea14fa0,1.25;0ebe0b2cff3146a208f936db6315b6eb,7.5;0,50;0f4e985a4ce2a311305c6509f16b30a3,50;0,50;0,50;0f9d9d038186b9ce82514dd1379d739e,25;0fb5cfc30bb9db2a4a346c3a1c2c9265,35;0,50;0ff176f7197a0758474e945963658fb4,2.5;0,50;107c39e04551eacb5b6ed810bbc6688c,1.25;0,50;10d0bf50c237833b166ce6290bf25174,0;1100051546843b11d4839668ad177401,125;0,50;11320f149f742cef58a1bef1195b4929,95;11335e0fb00dbeb06bf66c8e66cb1187,55;0,50;114e1ae9cf888c85b84701192d4fad1e,11.25;0,50;119a55c3317899b497b7d86cdf77988f,35;11e1f64ea1ab2d83564092ba49716ecd,5;0,50;11e53adea833ab231cadf2c2d162a59d,0;0,50;11fe3060a2d3eab10a06a937e1474e65,3.75;1254e57ad28747acaf221aac75cbbab6,0;0,50;1271f88b8f79c4c372dd1afc26f54dbf,2.5;127c75f1c08d06a054465f4cdebe581e,50;128854b7416bbe0d2107322685109c05,1.25;0,50;12b2210c2ba27e94c7c6420de8d41adc,70;12d8c99e1b7623db14196bfb9bcc7347,45;13032e4da67d7c5bdde5304efd1b921e,2.5;130e72d20ec6c14a4505d9cc2f432621,0;131a0a4042a085d83d46d9b0834ac004,80;1324505e97cbe65de5f2cb3f44569c2e,6.25;0,50;132dcb97e51d4809e1ad584db82ca7e3,50;1338b4f18df53f80b8e33d6289e8773f,60;13509cf04f3fedceceab14ad52bf5202,12.5;138115988c79ac1a5beb17f45881450e,18.75;13ba18d2b5b412d81bd8b8fab698d469,95;13ecfb4e226e448b549a5e3e9a1c16d4,13.75;140afb12ef27afad8411efdc8f53c136,0;142b7ff9cf35ec96cf802a2aaf80d062,1.25;1440d0588d7308f10134070b9c7cefe9,5;0,50;0,50;0,50;147c97aa7263d84a8eeccf72f3e800d4,12.5;1491f90125ec87c45fbc34dbeab81f9f,1.25;0,50;14adbec6061584442558a2a371f34217,1.25;14d14af285d964807273d32fa10073f1,17.5;14e3c29cb30df696840e66b89d436348,0;0,50;152398a158dfd951cf2f87aedf1a4a3f,1.25;0,50;1546f3fecc085227b3eaaa87485c9c1d,23.75;154ee375de9d845455e79c94e1586f82,125;15547d60f7ba35f8e9c16033be0220f7,1.25;155824faf611f87e12a860041dfca1e0,13.75;157fd6f6689a119e3a1cedc3bdc43f62,1.25;15993c1611265079905df6671f80f3b9,5;0,50;15fabd8d529db1f16315736b890ce38c,7.5;0,50;160c911479d8f7a8dec5672bee25503e,18.75;16202e475dd85c0274a45d8ef66ff418,5;16343a0f41ad37bb35a80e81bc97ef8c,70;1638152dadcac51f8bb71da66dfe092d,35;16506698dbd1ca39557f63d50699ccd3,0;1665eb4e38141354cd5a9f786fc04074,20;167e1cb1e8ef1d3771ede0175e848120,55;16a4a513fbbb77b756173c6d1cf16b44,7.5;0,50;173c5239b3b3d305292f9c900abfbd08,45;17632277c6f8f92738ffbdbb647d78a3,2.5;176fe99aaccfb6a91b4a22e9ee5dc71d,1.25;17769e442b01f980d02cbab98b8688f2,305;0,50;17f5e7090a51b1bf7b995e624941e7bf,7.5;180d0f2fbafa0455b87ecca4607d76de,1.25;0,50;1835bd61fabf63ea2b89e463875ed864,1.25;0,50;1896495a2dec166ebcb01a525e90cb06,315;18b87714296fcc8bab47758ec4de65d5,1.25;18c25e9a719c92bedd77a3e1c5ac536d,0;18de9309ac296d9e636d53ab0a1b5984,2.5;18ead0dfd4e5856b28586eb3782c53bc,8.75;1904241f1f257b5ccf6a5f902ab9fe44,5;190f02ccf32879a29639c5c238ea6a6b,145;19114686c299710b11ceb2b467432e8d,25;193cd7c15933c9ca00ab79a9f92a54ed,7.5;0,50;194afc7d064db8c82dc1a32074aa41a9,1.25;1963a6f109ea770c195a0e1afacd2eba,180;0,50;198ad0b7a49b6382c6588b3a3ad3c388,6.25;19b71e4285fbf679e039c6fd5b85da0e,16.25;19c33cdfe8a965f8f09fc58410f7eb2d,5;19c7dcb3cd9b48d0f7d273fed58911f8,6.25;19fc87b4bf584c5171a1e94ec4ee3b1c,195;1a4cc27c96d37b72cceaff8b664e45c6,35;1a4e7f5d650ecd274e33d31df93f6441,40;1a8309fae79be20b42354b049e392fb3,45;1aa293f640ed36d9e95adea4eae46581,0;1aace2ce8237f2e1639abcdb93939dd4,220;1ac793c529cd6ffa942afaef7c5068c2,90;1ae78992d950eca9c475b87609506611,35;0,50;0,50;0,50;1b4c20cf1a314526b5305d3d9069b394,2.5;0,50;0,50;1bacdb252f5bef4427383960e930a361,0;0,50;1bd28d361cba26ef8f05e0e87ebc309f,15;1bdcc065bd6d5a89971c22682dfcc443,2.5;1beda463689f206361318f15462574e9,40;0,50;1cd3d44b18be07e4daf1aed496e23654,3.75;0,50;1ce3488a94b438352563639368e15aa7,6.25;0,50;1d1bc141a208135efb8c71c2018d22b7,0;1d453fb03ecd1542603bece39b076632,3.75;1db724c5bbdef33acfa16e037f113e6f,0;1de238ea03ddbef9fdeb868de4c74cce,7.5;1e0d69a04ab757dca00fe086328e0052,105;1e240363cbe48e99394365022b18a429,16.25;0,50;1e54c852d6f869898bd6e178455aab5b,2.5;0,50;0,50;1eab9d3439c2c7037600cd3eb3210c62,6.25;1f46c1aee0261e172fcaa2179fbc78f6,3.75;1f4d8215cdc884cc2eee7a7a29301cc2,8.75;1f61767caa1ec9988100c5f7b3d36cac,40;1f65951af61f337be04c8549d3d0e7df,1.25;1f76660396a6c85fff35b16ba550d85d,2.5;1f77bb11ecec1a449e616034c44c23da,65;1f81c925258a48abe4fae04920e6cc66,60;1fda325ff886a2bb0ed2a58eef458931,13.75;0,50;1ff457bcb9860833f66db19b48a3d9f4,10;2049f5c4c4f3412ea245eb54301c2a00,55;204d178f9b6d4de25297c99fed0ed860,5000;2082de95f77c4a69fc878de0bb3b2af5,3.75;209cf08ce2d60e836894ef4fb991ddc9,95;20d935529c2bb4c5cfc978f7a7ed722b,12.5;2103d322c0709aefd912ea4d99452b60,80;21099d58d550518bbaca6ad398fd36d4,2.5;210ac778c8ee55b3c1bb259e21c23a67,140;21184ba2719993e70d473e03feab9bf5,1.25;213692e90aaca3de6d2cab1c275a91b3,2.5;0,50;0,50;21cfd11edea6b24821b90f9c902aec00,1.25;21d2a18ac20936fbc86a9cb33b039da4,0;21fe409c1eca5d2e18338921d3bc823c,5;0,50;0,50;2272cd546b4c22257322839b6dca02ad,2.5;227487eeb096074d5bdd9d0e1852acfe,1.25;22758d57808f63ae2b38c8401fa3e598,0;22bdb49b05d620e1da710973ee76b3eb,7.5;0,50;2327f96c0a75870c2fd5e97ec5649c7a,21.25;232c33c207395fd98b1d5b0f31e435c3,2.5;233066a5b69a78fc637fca04eed48d6b,3.75;23a015fac33920274fc8309e422ad176,0;23c660ef6d2bc69479042200004a4d87,23.75;0,50;23f38656a95ed075ceec294708208c09,5;23fb46016e1456d99ac9101ba0d1d0d8,1.25;240a8d8616ebe69d5d906f7a3652bca0,23.75;2410128f88f95c088124eec27b8b94df,13.75;2418a181a8ce117c4d633dec892cf330,0;2419fb27eba52ae5972930cf1125e276,25;242466d114cc32914e02874e6226716e,18.75;2435f8ae46be67fa25b97d8dd31a9f0e,5;2455f1603c87d1590208c873f783b651,45;2462852f7ef0e4f00350dd1e44696a62,18.75;2481d123ae016fc584a99c01f04679c3,1.25;24d7526c82e4892dda4c567acfaebe9c,17.5;24e473df8c25c3f8cb8cd1a8a0e195b5,195;24e505bdf49d468bdcab62df799b5974,40;25030afe5a7ac52cf87c1e645ad402a6,1.25;25152782a45e060ef8f789a75b5a95e8,21.25;25247e504736d41b333535ad14deb150,105;252896af2561d8b7f3dea6f2e36061e9,0;2569d8ca4a6d4fded8091f85f2e3946d,145;2570e257d2bea64bc3695600f60d3337,2.5;259b837e185e461410bf4289ad7a0383,1.25;259bc772968e98921a87ea496cd74664,0;25a27c534282be4983e36ec1f6c6d686,3.75;25aa5533a8fab1e5bd4065a9eb815156,2.5;25ac460aa7ebe6800d67f4bbc9eb6fc9,0;0,50;25bd7ff42265d0b5b6edbfa79ba9e432,1.25;25c5be57374360c534ca9c2571556f8e,0;25d003249f8a48a462584bc4bf550e26,50;25e791a81c729433588d0dc076830d27,1.25;25ec44b1784ed33aacd252b285562a0e,35;0,50;2680890b90dbee2087ecccd16bb168f1,8.75;26a29ea0d4e0a74b4512b2306b35278c,60;0,50;26fc42c9167fae5ae43e4dca2978c5cd,0;271278273c16968a38b63085d0a9610f,0;2715d68fddd2dc2ac6a0151191dd9f12,3.75;271870e186c59eeb85f29c65888d4b54,35;2727abe80b9f206c143d8aad07beaf3b,195;272c3c7b15bd822930273742bca18fdc,1.25;27333d734a0ff6b674672870a8c86714,30;2739e10cc6acd5fcee74199f46428534,10;274f4aae5a3041085e95e9c6c0acc6fd,95;27841bacbf2ccdb70eeb13005ad18510,200;2799b8e961bcaefd31b7aaa0607cb2c4,1.25;27ba1686714e80a27e9a207d3a006c02,8.75;27d542179e931069dc31a42b0f512392,850;27ebd09fb3dcd68d60838ae3434d8710,20;0,50;0,50;2856d86897e43e601daeb1065983043b,3.75;2856e11490fbc63987ee0fb013421a03,2.5;285ff8d5014ef73cc83580338a9c0345,185;287f8c64c9903f49035fd16ba73dc4dc,22.5;28a5c23a1061697f57db1edd9ba4549a,40;28c530c5c941e0da1d8d98d2552dcce5,5;28e0ae8715768aff53e2dc971251402c,80;292c5e97f2c154175fe8100012a283cb,35;29492cde9f3bbb26fe05d7a68b55fe6e,0;295ca43168556f9fd96867c1e4b57992,22.5;2974e20c3a46c132156a13ed0e73eca4,30;2986d3e2497733ac3e4e95ef8d39af82,215;298becdd13b132064ce8e5da4c2e6ba8,3.75;298eb06debd588d27075b62804740a4c,1.25;2994c83ec2bcb7ad9bc01a5e60c96ace,1.25;29aa911ec147faa8927d15f0eaf57ecf,18.75;29b50891c25e1a2572409e32e3872945,1.25;0,50;29e886a19d116dc4f569348fbe5ff811,145;29f12dc6023619cab1c87f1f52914dfc,35;2a132eb110fc7d7c1d78cc957aaed5fe,1.25;2a258e2335606b01e3d8701ad7d63c5f,1.25;2a36939a9f3cff33952ed33dbdaeb8b7,17.5;0,50;2a567ce689d5f1a55c11578a8609a5d3,20;0,50;0,50;2a644edc7aa7b279c8216019f3a48f06,1.25;2aa2958642bc7b97af20113991e0fca6,6.25;2ab101368217b5888196d6a0e0cd61b2,0;2ab1d25870465d030757670a0a8dd6dc,40;2ac53ccd52c3655a8e15650ec02f9a35,0;2ad4194f66a90564cf26778ef29d8247,0;0,50;0,50;2b28dd6fd317650b0615ce4913d5bae9,520;2b33056dfbf5e5846964be10bfde6410,40;2b6b16e43e220ea6d4029a66db99eaad,1.25;0,50;2b815a31af79b825e13a0ebae2b388e5,17.5;0,50;2bccce355d5e0df9d7aefc38fc2705f3,95;2bebcc51ce6b307d8410ba59a9072039,480;2c4d9141c42abb1e9e465d806983ea5c,15;0,50;0,50;2c9bb1975c98529ef578649203a449ec,0;0,50;0,50;0,50;2cf3f182687e2eefe4103d7f2f8a373e,120;2d371a11f37f2035d26c6738ba64b947,40;2d37aba0d3decb72190c1053f29f7fc5,15;2d3c72a0cac1012c5a79cd3f3ef83bda,1.25;2d52efcce56e6d1ce19c0778f5e0d38b,23.75;2d7fcbb26dc2ea55502553a2d7e66186,6.25;2d8398cb34871cd48f3281ca1b69c93b,18.75;2d970fb5b1c4c346876cfa0bffa73980,50;2dd690ee460688c7c2fb5ae622a50ee5,25;2e2d8005f09feef6ecd400aedfd9cf82,2.5;2e4b006f0687c93d606e92fcaf79fc7d,5;0,50;2e79d8f6d3f3623b31ebed0f14343607,85;0,50;2eac618ae38dde417921473f8f54dc8c,65;0,50;2efb03ff67b254f248859b9a5b091c34,17.5;2efc564232f2ac881bf992a6d8b4a3d7,23.75;2f3220ad96ba1867267252269f5829ad,8.75;2f466f1422af73eb806fe3c610fc042d,0;2f65ba5e9fc96e0a0c89bfd5541e1e72,0;2f77f764c4a31e7f29e7be78c9fb3caf,1.25;0,50;2fa5216607ecda3cfb99050e305ceb4f,310;2fb13153ba7699f46e2bd91ddae5bc1f,23.75;0,50;2fc4ada00afb3d2ff1337c1a7e502cb2,6.25;2fcaf5ae175f8b604fdf344b1d970092,70;301284bf125237fe3ecce2e2d04c3d08,1.25;0,50;302d89b28edc27fd02fabace737a1bab,1.25;30371bd00196619853782bbf95df2880,75;304db089b39fb4b8693011ec76d25444,15;306843250cc1a70f0a83ca5f63d58eac,22.5;307dfa258688c9274d18906cdf22a957,30;307f6656d708c429a6c4174114fc834d,30;3081ff717f5e91cd0b47da5349bda89d,85;3088501f0ab8b252e5c3069651adf4e7,0;309a1bd57a746241e8b04f39c38d118d,3.75;30a22b44c728edfa83a39d2a709dbbe1,16.25;30a488fceee8c0fe54aa1346dc3a65b8,18.75;0,50;3100545d0b7e0923ddecfe509dc0dcbc,0;3106920846ead813a9b0cea0b69fd78c,10;0,50;0,50;318fc669cdff43f60b67fd5f7791651a,3.75;0,50;31964de0208072ab3868ee960e0db9bf,3.75;31a6a25545803fe2a413486ed032064d,0;31b166561cb4639e816561ef7a5f25d1,190;0,50;31d4d989f5f68c1d70b4a8e757dc08ad,55;31e90abd9305b166bff3d853f907e9e4,10;0,50;323784b475857b837b4980235e1250b5,2.5;3238ed33fd0ce096016a82a60343a2ef,11.25;0,50;0,50;32b4c6a08f16882ff70fc2eac56e8a73,40;32c06cc23ec1d940d9ca336971a7023f,5;32c10dd4484fc66109cf48bbc490e60f,2.5;32ca74dd9b5a1dff5dba9c277165f3ce,3.75;32deab6b034ad796bc9537580f7c16d2,16.25;32ee2ae7b68222ff8cc83b39a35d52d4,35;3300439bdaa7574d5958b8bda0c34299,5;0,50;33a59ab3fe8c1ca266ae6e58bd106f0c,17.5;33b999143e4108d2a641b03642814f64,12.5;0,50;3400232bba3d404ab2cd4f2375a2cff2,12.5;3428674e02dd97b2a07644f0cb785e75,1.25;0,50;3448c9b19c775b70d4a86bae6d0b72d0,45;347cc1581e31f5864a072e3d6fb92158,80;34a52f045ef95cfc78cf4e38d54ec2a3,175;0,50;34d68eb799e5dc39b66b160b6da29e19,1.25;34dfd33b5dc960c4f92e346efc79e025,6.25;0,50;34f3d247ace7b0d490a4ddc04db1198e,1.25;35163d75e76fa7fe55b69b0a3b6dde48,3.75;352d0a5d4e3b8ee1f4f73a392604b4b7,2.5;3534084dfa6900327f3246cd71bf9edc,0;0,50;3551328c7020d2916a70cfbe0e4e04dc,1.25;358a2a738169a72a484f888a90e309b1,12.5;3599e778dc0573b2dc8b7adb21dd9125,1.25;3612c389e49c7d8aabeb65f94dccc481,1.25;36130b8ca3b36b521cd663e4f203b220,13.75;0,50;362f13fb407f2b3b31e598d990084f34,1.25;363d6c820aef2dbbe082768b40feed0d,25;3640e93d6f77334e6a153ef42e62c1f2,16.25;36426c381e65c5e28ba4a1dda2ddc692,17.5;365fa3000d8605751fa26986a07312ce,0;36767dd97caab66260f85bcdc5fcaded,1.25;367bf9bf7fa8dcbff2a2aa5c8a15c276,11.25;3693f209016eb19127d44dd37598a099,0;3694d613c5b724111186b9b5e1c90987,6.25;36b2e0bc19926a7b4ebe5f8556bfdc3e,1.25;36c97b76a5b7cc67a9811238d7c8d2fe,70;36f64d69eb8c5ee9cd24178b589af83f,00;0,50;3724f4f178b5900b8d2ef459c9c6390c,21.25;3753a6168b202703f3a7c8ecbd122302,1.25;37659f81856e2b5a593b6b8260496121,0;0,50;37740fe65e722d7f644baaa0900a31c3,35;37a2bbd4eab5f01826896485f6f85d89,21.25;37b273e5d905dcbc318dd7c26f4f6d4c,20;37d04a47c7e73ea910ddfa345991235a,20;37e00dc9652d8fb9c8f46c0154c48416,5;380348beb7eaf2cba4ce3ff4ac3dfa89,65;3829e8f8d114cdf32d5930a9efe8a011,2.5;384b5a0dfa52458a6e30ea4b40100b24,0;3892d0b1db95185b2d0ea34ad5bb2bce,1.25;0,50;38d5f74909eb2b79691c74cb023dc16f,70;38fde78a0f3f721e2453cecf91111a22,18.75;0,50;392adbefe3921e9fc8162c8b448455c7,16.25;393491f5de9b4ef0d350fd9127fadee3,0;393fbb53a3dcf6008653fbbf9b25b761,16.25;39578e45afbf5e766bea49971d8a3d56,35;39653bd4d97c4cc0dc91a06576ea9af8,6.25;39a90afd323780231512067002170b6c,1.25;39ac616c742eacd2acd078ff4516b652,35;39c23f6508a379eb52a0a146386ae67a,2.5;39c39cd511790febde28bb8f5bd16279,0;39cd843c432959c0cf9d5455b820b040,445;39d042f5bf38eea042a1df3fec390b7f,10;39d643f22e6370f295795cc67d779c93,50;0,50;0,50;3a0941c1ca14936c39bbe9241fab7b58,50;3a11965fc943da0d7728f28097e8ac41,1.25;3a173da0c03a1bf012dc204c54780ef7,1.25;3a33d814b1b9cf0f0a65ec0356f62a01,260;0,50;0,50;3a9e4fef5aab78f76001fc0e81add764,1.25;3aa3516cf3b19b343ae7c164fec56916,18.75;3af3d5f002af7df66239b05a0fb2f970,1.25;0,50;3b0fe8ac97b440033199977033b361cd,0;3b201d6dd5645f3352f30cc0ae492cc9,1.25;3b3faf83b8d631ce312eeaedecd761b5,720;3b506ca17b3c9fba239d8059ca4846cf,2.5;3b6a56ec59eccff260f947784b4a0f36,10;3b6dc2071547081fde8af9364f760c37,8.75;3b9cdb1064deae88b839bf167d54eb70,175;3ba078be03af543a54eea1c10812a716,1.25;3bdf7327af96b785a14edb7a0f4c7ad3,5;3c077620e211d1237d796b34fe93941d,120;0,50;0,50;0,50;3cbdd3479037671b3575eb6fefc7e79f,2.5;0,50;0,50;3d66e11ed9b5f2b2560831c86cb2a5e8,380;3d94db00b3c9b28e73d8b5ca5cbed4f1,25;3dac7817b15509f9bc6df536cb71c28e,40;3df6e3662e9fb9653957f8c0866c4e0e,30;3e05fa9a177a8c8ef4b1b03207393dd2,30;0,50;3e28e6a8b460b46091b3085abdc8dba5,1.25;0,50;3e4e5ee66e0105c11dff0eed0519cf2f,40;3e667635d8564358c1df28d43446f6b6,225;3e6c0860144da2369c0fc2c8e37f4ca2,55;3e83d0bdcad30a98acb020a700f02ccc,115;3eb05a28373fec3f42f509d5054de10f,2.5;0,50;0,50;3f3d11a5c0b5ad2ce388caa7b6bd8cfa,5;3f6b519a871e698973d52a71deb53236,1.25;3fb01ffdd5f274efa8d068ff9244abd4,45;3ffc41d0451611709d345fc7524d837f,50;4018f7c1757226f9ed243b4d5576ee44,17.5;0,50;406c50e3243d7bae9b6d67e732f2ec9f,90;4077daa237c6a89b1de46427ba6aeea3,0;0,50;410ade0b286579083b52fcf2d4f8fa2e,11.25;411567587e0d91da48f891aef5b1e218,50;41261836240e4689f414b6ad927cb4b9,15;4127b74138df74bd736ff028d73cd6d6,0;4144dfb8fb11cf3b2aef513ce71ec61f,1.25;416e6717466aefd2f3ffb768ed37b38f,140;0,50;41d9c0a351df384e2151b8b6184a9089,1.25;0,50;41e34ce4554d0e4bb627649a215f0bbd,45;41f3cf3ece029a034884701ada7bf08b,85;41f74199e5d4bebc6feb7d225507c2c8,21.25;0,50;4217ad404b141716d5a62c6310c4962d,23.75;424391861576ab2cacc55ac5a720bee7,1.25;42507db3cc979a8da12cc68b6d87fb6f,0;4255bf7a07011016e9152f2cba514f6e,90;42754bd93b87913ce07affcf6f903a06,1.25;0,50;42da2ff96627dbdbeba12f5086a425e6,1.25;43146963e7d4dd01e5a4484f512d5caf,1.25;431d0ac8a393f828adc516d173553434,60;437647201dc201f215392cf92d5322ca,1.25;43976f32f82d1a2e917a4357c4e62ebd,55;0,50;0,50;43ba1b6cfd38c2dd0128dbe434310c52,0;43cc6d22950614e3d7f2873c2acd4fd0,6.25;43e87b406ac2cfe501dfbee3c7745ed2,1.25;43e8f9f4f9bcb4960886d949a6b3c4cb,1.25;43eb836a309e2fdd687c9aeb7b04eef8,5;44171557b5c9afd6271e52ac0e0393ee,110;44234729d08b5cc425d416c0a80f010e,25;44787e32b6ecb2b1a3e0db42cc1f5355,100;44814e2a5b987017d5746d28428a1825,18.75;4496ef44962d8816175b90c4b2ae7d07,3.75;44b370244b758a353bd601852a253812,15;44ba010b758be714b1d31c1fbc1c37aa,15;44f3310db6eebb4d478dd8499cd414ce,10;0,50;44fdcbdeabc3343e9423421cc96c6187,0;0,50;452606c09e62efc8df6c6b1561bbd1ad,1.25;45272229fb8fca150b3af5136f4799dd,100;0,50;45450db757625badc83bb0986a5a05ff,0;0,50;4563338e20bb2bc44d6ea9dc28bb70f9,8.75;457e8dc224c7e5bc9e56e0ca4015e257,22.5;459c370be585239e8bd677a0d17a265d,0;45d2cfa253ae0bd3bcc13ac60ef3ca57,50;45d41a9a72999e2097d5aa194dcac9ea,3.75;0,50;45f0b18d3abcb35452bfc7fe7a978c8b,2.5;45f5f8d682d68e235e8aa5ba56e5d2c3,1.25;46023cf1e7e2e696cf3e550eb9d74dd6,1.25;460666688f54d04f41722588a206f86f,1.25;461a64d15831e30612ef9ae342e8038d,2.5;0,50;0,50;46e35c04a2e1132c063c45fc10d06674,1.25;46eaa0325363106fcd97b35be9a5c24a,150;46f64d69eb8c5ee9cd24178b589af83f,5;46f6da7497720933204d7cc478619bb8,1080;0,50;46f9e92558d4767e9dce02c5306a7ec0,2.5;47169107c091ec1cdc3289f49a1accf4,240;0,50;4764e459792d9b54b62908a5124620f8,5;0,50;0,50;484ac11aa23e0d1eb96ab077c93b5ee8,50;486fdb05d259bc55b1ee50ee507242f3,0;48702ff7e416d3f0f65a3b2af2bf25dc,6.25;487d53482e041390b3f2ef8112c39530,0;48afaa2603f2c2a285cadcdfdea800bd,3.75;48b36e89a248e864fcf92b537791edca,135;0,50;48d7a3715f2f60bf16184d10dc3edf1d,3.75;0,50;0,50;493838c5c174166fc5419268f5fce98c,1.25;0,50;0,50;495f744294b3df685da28664985402bb,1.25;49825c10de10c5b2556a7cdcd161a868,0;498cd0cce160c06b0efa52064e96531a,1.25;49970b82be2fc6d67ab78c3060e3485c,8.75;49f165229569bc8e7e49817686f8e23f,800;49f5d6ae6795dc13de42bc56af591a42,5;4a2761a1a29ca83444d5ed1f6f641ebb,35;4a46f179a9db63cee678c988a3aa8741,12.5;4a5176e4703036c98acf2d3f51e9ad9d,23.75;0,50;4a7d815d29be5adc1b7052f465f0d1ea,220;4a872317342ec4c7bbe6619b22e349d2,1.25;0,50;4a9dc577aa0090fe4a68f558fb7e3837,1.25;4aa74e11f2ab67766de8475593c2def3,0;4accec0414fe511392afa9ba6874d78a,30;4b0d96e39429bafc65bd1d3a8dfcd8eb,3.75;0,50;4bb728c90b20abafc3e935644f421b60,6.25;4bccc9ed9fc8cd1a25c92313818b68c0,1.25;4bd3bc6ec82e30a222ef8d1bf2991d74,1.25;4c0cfa75a878afb61662b48c409b2386,55;0,50;4c16785dbae7703d3c286f5dd9c54020,45;0,50;4c27f4e2cf2979c3ff38ac544c2733c4,1.25;4c5a8d63d604df29f09f15714680925b,22.5;4c76488684094b9d5292b5353aa23fe5,2.5;0,50;4ccb5d307a952c3d06601081fa060d61,1.25;4cfd748c900d1baccfd304fa53777bbb,22.5;4d6479748f61c6155e1f6e1122b744fa,0;4d69be38d1ee1cda339425600732f38c,1.25;0,50;4d9411a312fc384a6206ed46b671f9ce,5;4da3743bb4071d6cc28bd862d7ca99ff,21.25;4df3a46d36df6e1a85bf5e6fa7681172,0;4e3151afbca820260ace7e35daaff697,1.25;4e579cd323d5c2b17c46accaabc60778,0;4e795eb72fed0e42030bc9549877d03b,0;4eda14a2be77e7d16c988d56adee4af9,85;4efcd623ebb1d1280f4bde8081b886d7,1.25;4f0fecd04be3a74c46aa9678f780d028,65;0,50;4f302e181503bc27c4b87b8507be0985,22.5;0,50;4f4c22865751a0ddec009df96db4c9ae,375;4f547570c2b323e3de3a390851dc5c0c,1.25;4f6d7b15b4ffbcba3f5613a426bb842c,1.25;4fc1da2f1721aa364e50ad3d57bc739a,1.25;500f87547f2a23f8306918f803247d5f,0;50178bea882248e42e77d0a0d4b412a2,5;0,50;50b175ff128bbe6fe422c1e9bd60551a,10;50c49c94c2d3e43657eedf009e48c5a4,30;50ca7add82b7b1757f6027a2aa33a1dc,50;50d9f166778f02bf30ac3a60f3701e19,6.25;0,50;0,50;5137bfcb88c71f5e40f83d71f1d8568f,1.25;513af4784ff3a8a432ed01978fcf8239,1.25;0,50;517217f1339bcd695a27813b0e3863a9,15;0,50;5188365b01e83b3244477e8c9a0062f7,7.5;518b20dcc7217d02bb484d7e24015266,12.5;5195ed3dbae78ce7f33308667c18d212,1.25;5197047ee3ab232f6d1b99ce8003963a,45;519aefd65f7c273f57c2d914053be96f,22.5;0,50;0,50;51cc91f4d02b12eaf1a772c3fe7bb414,1.25;5218e40846677629225f0c6bd5fdf428,55;523e8153b2c6f5a6af457043f681e2c7,23.75;0,50;52987d1393808fffee993135ab177d02,175;52b4b14c1772781151a80edde9d3be34,45;52f18e715ea68c15273efd226018dab1,0;5327a1d7305c86a4fb2df34649e70295,1.25;533d678f9f1fd118f45cae2ad3439654,5;0,50;534137c388453a2de05a1ba3c8e30d94,25;535fb1c4d3230305a57a95d94902f58f,5;536fcb1f96d4c755f4bc6515b0e6ea23,15;53849d520b59553a530aaf21cc645a83,2.5;0,50;53907566099fb7fd9b9085f80f21b5a6,65;0,50;0,50;54404c886a6a3ffe385d86326de7a75c,7.5;544ab3aecaaebae3884354adb7348b6d,0;54a4977f7458383527e7082ea757748e,5;0,50;54b6924f9d2354c2434b414c30a8583d,0;54b70986cfe93a59dabfcda63d3fb522,1.25;5506f0410b754e98191ada888423b4e3,3.75;55082521e5781c6cc91aa6e2560f3338,1.25;555a433dfa6a3da4370785bdfffac3e2,8.75;556aa48600aa6a423dc2a7dc9058f0af,105;5579559927de2ca1b5e73c6c9eb7408d,0;557f16594dbbe040d13155009e949783,6.25;558c3e1d4623b1b03396a066f94d9cbe,2.5;559a8c195773bfbe89154a3da0c7d13b,40;55a0cb448335518eb401631a8c31de48,285;0,50;0,50;0,50;0,50;55cd02be28521073d367f7ca38615682,255;55d5bff8d4a1f038692788cff11fc400,8.75;0,50;0,50;563266a68be74bc9edbaf1fe8304c8f3,30;564095cc8d2bbf62a4cdd39c1b077e39,65;0,50;5693d396fb5e03f2f569b0811bba5e85,0;0,50;0,50;56becdbdfb605731c2a07f2f0d892859,1240;56e40536828e7948eff5c8c1c65f0fee,25;56ee064cad337355d0d09d3c74cada96,11.25;57082f1077615cb9bbdfe155fb08c16d,1.25;57297e64913d406ce935515010799ec2,20;575d3a53f4ab77448fae6aa5f8f5bdbc,13.75;5768fceb3426bc016c86ad5d2e16ae3c,75;5776d1ccf8a3ccec8a382e92044e488b,35;5786fd54a1e774eff07735d52bd8e82e,45;57bfe70f547c240206ce62be4406bd8d,25;57c248907745534871b376443c21f5af,1.25;0,50;57fb94b1015f257feb539d36cb65540f,120;57fd619ec54f1cf934abdb717eddb725,40;58128a04acbd05ca44a50cc381b2665e,85;5814bf6781118f862b33844b6955fcc7,0;582456c223dab39e31167a05a59d77cc,3.75;5831ce2aaafac8b2afdca3226eb3f2dd,18.75;0,50;587d4e79693da1de3618fbc85e13dd6d,85;588caa233f04012e46fb194dc5242655,1.25;0,50;58a91bd739c216c35ba9ad5ac2e4a1cf,1.25;58ba3afd5b36c5db26bbf832a403e75d,15;58e4c0f27f7ca8bb6238f5e7b1f23ed0,365;58e565221db80d168621187c36c26c3e,2.5;58f338e522e87352db4aadf783022271,16.25;58f5b01c2a4356551bb9c770f2ce84b6,6.25;590ebad6f7c8b96305c02b7ae3118ca5,40;59126111e2185f364a579902ddd90a99,2.5;591d97a90ae4828ccefc9609b57704f8,45;596ed713f923e45deecd99098b507bd0,5;59900fe7ef44fe33aa2afdf98301ec1c,90;59a90501bf45a4f796c20553e12edb73,0;59d6620d9e6ed26d6225ee21c295450a,8.75;0,50;59dc360421f35ee08c303a1356ba971f,0;5a094d7d93f6d6370e78a2ac8c008407,120;5a27286ff16139609f41c007a98956c0,11.25;5a4f5fe06889a90d19f21ffefed270ba,1.25;5a5dcf06ecb928541d67adf68b19afc8,105;5a95f32b7f396a65cdece7611e22f681,6.25;5a9d423f1cacb19732bd78b40320907e,1.25;5abd35188c984cc0089e301b84be447f,0;5ac095c8797acad6acece5321e51f069,400;5ada2d8c7de68b7bd0bc8ac79968d96b,1.25;5b1b598981fb635791d6a5a0326d5703,1.25;5b82b88264a022827fc93eccc13f21cf,2.5;5b9ddc09d04112f3d861a65638230e40,13.75;0,50;5bc29463f687174eb5ccfdd91a7f4f43,1.25;0,50;0,50;5bde9859c50b6648f44ffbfd4e43ae5e,65;5bf08fe0c18c25c1542170d3d709f465,50;0,50;5c215dfd464ad07701a001e30bac678d,10;5c29a2f4b123bc352a11425cd584c08a,115;0,50;0,50;5c570dbf92054653ccf2d460cca0773a,1.25;5c5757cf8bbaff760a018c0e7d3cd358,45;5c5a0ac93fc004296d19101970598527,75;5c7c2a4ef583f8ea2b7e6e93c7d6b091,1.25;0,50;5c7d113191d667010aa6ce3371559a26,6.25;5cc68d90e0f41da83433a369452d7269,1.25;5d0289c6a9a4b1807bfde5006dccf1a8,1.25;5d08458b427742d5cb90bfc80cf8acca,50;0,50;5d461077eb1ccea5211e02a7c52194cf,90;0,50;0,50;5d5fa22b9962c43778ab1b898fcc0ca0,240;5d69de358e4826b5b8ca94aa759636d3,21.25;5db5009377f6230e7ae6810098bdeb64,150;5dcc2cda74bbec9addeb5ab85b19486c,3.75;0,50;5dfeb00f31d1dc66c4ae41769fa5a414,1.25;5e0e4f11b543f6305f3dff19e75b37ad,3.75;0,50;5e2643eaaf756261c14266b20615164d,2.5;0,50;0,50;0,50;5e741cbf121f50b8d900c0dfbd91b9d2,1.25;5ea36f22b19ffa435272df2a3085d78e,0;0,50;0,50;5eefb36471e96bdb379070069d33b8f0,225;0,50;5f206f44f5ac5b8d3871069ba35d0a3c,0;5f4943990a0fe0ee58465d521f2caae3,0;5f72c050e6113cfbfcc964bd5eddd359,7.5;5f86a117e72894aef2fec9066a04f80a,0;0,50;5fa2aca455267a1ca8d963624db3f779,1.25;5fafbe6930402bb3d4a46897287ab2c3,200;5fbb6520a83d78819f7fb0c9796fe042,245;5fbdb4cf93267901387eac47b826d9c0,185;5fcf7db537e9d862a6818adce1963cf9,0;0,50;5fde3a3d059f8f9a83e0b4bee880877b,25;0,50;60329cce9f0f9a36b4cc200ce9cb0162,35;603f1a690bd76ad283d67480e011cec8,11.25;0,50;0,50;606310ff4d319789a4acbc6e36334390,7.5;6065aaac6cd4802993fa634eb6d5fa4c,11.25;0,50;607a6b0c183392c35122102685db312b,1.25;6081597053addf38a34795d9b052331f,11.25;60c4c00efbdcc488e1246616428af665,0;610a567aeeab933902544fe36a1f46ae,1.25;6110dcd20dd010307cfbbd92e17c5142,22.5;0,50;61352139ef237d88badcab4f247dbb16,25;6139177909af1e2fe15dc658dfba058f,30;613d48a44ca2498fa2c7eb65e7120839,0;61805f016f1cdf5cbde9b7c3db811c61,7.5;61adb1289f389e715c1146216d4906aa,3.75;61bf4a1cb19b0fe376e4ac82157c39e6,3.75;61d48c317d3978c522c7eae8111730c7,145;61d65a5b31d2e0a5125b02205b7a492e,1.25;0,50;0,50;621fb15416b7a0ae68639ed91a2ebfa3,21.25;622d5b5ccb41254d2fbe051a677069d4,0;624af997f36b7c49d10abcf04bab2368,10;6298ea8e38d9f12757ac42df1014fed3,0;62d367802532c6c02439f506d19d8b6c,70;0,50;631804c06166c3b1390edf73f477d262,40;632b1d5280af4929fab92eee6ed1d920,15;6345334aa56a45222a62e9b99d5677c5,0;635c4bdbcaaf17c29b04b5fa786dd5de,6.25;0,50;0,50;6387eda1469f5c8f07bfd57eec3b16df,13.75;63b06dd944e9daa751006df3e560d030,2.5;63b747c3f2f61e55ddf5e041fc4c9a05,1.25;63d16f6259f4af0df85bb60629c86e9a,40;63fee39e1538c86df43ec41f98f26dd1,23.75;641eda1f32141ca9e574dc29718f7306,1.25;64200123ce5c8fe449b1f89f5ebcf87c,16.25;642964c79125b793fae14c0844fa701d,3.75;64296ed86ba4f1d1445d0b44da841f78,1.25;648e5f9733ef00cc3a44718b488ee799,0;0,50;64c2f22136127a6c2f77ba038c9dcd6c,25;64f50cb82800863a7f5f316324d01194,5;64fbb3689af59bf54950dc02fab5334d,2.5;6505bffb3eafae71310c39764f61774f,8.75;0,50;652147ab9316678729f6175bf241de02,0;6522503eb91580a36e878052567fd992,11.25;655d5e4a82660e0e2adff3c50675a14c,3.75;656907c542a0d1222101637421dbb40b,18.75;6584831f31981b81d8d22b2add556335,50;6586c7a2c89cd73abb1fe37d2240a80c,3.75;6587b0c61624d2b891fd4818e9d539ec,0;0,50;0,50;65a04e48495e839db4645eb74ba304e2,70;65a9035202fbd0c2dfa18453ceb30697,2.5;65ab42c37a94e9bd3869dd52d50ac7a1,2.5;0,50;660f1cb267485ad903ed8ca856bc8d8a,50;661acb02264b8d5c129fa3c5103b52fb,16.25;0,50;0,50;663fe6b7010ad83e4d056f00629df188,30;664ed3f4be02dbdf1dea36ef61e4c66f,35;66811aa73faf0dedfc6419e44172fb2a,6.25;6681e555cc423b63c6069f9e217da908,0;66b46ec70995f5586399f05216a3584b,0;66b72253e65aa9eb2fa66b7a948870df,20;66bb7f7188387b79f506f56942cbe5df,1.25;66e2778644bd2274c93102034ac92b24,3.75;0,50;6722b590f36a7121acd3a441ebc9bd2e,2.5;0,50;6793a15a9306ac44277737793b700d86,0;0,50;67b0f504a77b3f91429844591b1bbc2b,22.5;67b6ea3ddf94791ae5fb84b575c881c1,30;0,50;67fb34fae9fb3b092b031f3455c76847,0;68210327c48aa6c4b4e01eac42669d3b,6.25;686ad2936dc628febd74dc850a749835,0;0,50;6885c14cf468a9a7ca0d2610d2850849,0;688c698ac5bcfdd3c1c3098eb692ca32,1.25;6895f303968ae1ccd62e2b174739cd00,22.5;0,50;68e989f93860ca8393a464f0a095fe73,90;68eba0780732e1ab547caa888c2f3431,35;6906dbdad1b388ca39fa23be405687b1,45;0,50;0,50;6948e77a33fceb2cef51184fd480e5b1,165;69965b6c42f92de559d9766e2e8a9700,6.25;69ce829f660e550a75876ca3b704d1b1,1.25;6a131afebb1c7dd718001e77c14dd230,30;6a151dc81304be1c02435fcd067ce668,35;6a1968d4ceced2dbbd41d49b2402f9e9,30;6a1d0093dfc3116f3e860546f6e004ad,16.25;6a1e991f1416340a215a2f51e8323d0f,6.25;0,50;6a29545cd953d368ea6a2277f2985797,3.75;0,50;0,50;6a493af41a5c8370045e1b432e893145,0;6a8115a8a756e33f62d8e21ae95e8095,7.5;6a8aa5343a6cd1cd0697da5a444eeec8,7.5;6ace0fa3c8072d52af486e4769a8863c,5;0,50;6ad54a9f1c4d97c9f1857b31c6a4127c,2.5;6ae1bd193688a5b37f30bc3ca18a4b94,0;6b053c9c7d2dae33ad868c41e2779286,0;6b075145fca06c9f0ddce6df72331be0,45;6b138cd8dbea4438e1dcc3c044d4208c,2.5;6b1d56acbb46d2def060db99fec4f36c,25;6b27e18f2bbe08d98542351109c9da69,1.25;6b4b847528e3c21caadfd1459aaf9eff,3.75;6b5280410f95f0ae72f5b4c5164d9a0b,1.25;6b676026e41d58a9e05f0428166a22d2,35;6b778f9d4e8cecd3b9b8ce392949946a,300;6b886355089fec17ed4bdd1dd77d7fd1,50;6b93486f318208cd2c41106ec06fa5e3,2.5;6bb454bb70d0512a87276648c63ab92c,0;6c202a503c69a729d876990f5c563510,1.25;6c3902c92a7dc57c304c4208de952d23,185;0,50;0,50;6c78cc1b72e28daaba8d03cca3b3eeb3,1.25;6cfc87ffa9dbe03cd875519a3b22c8f3,45;6d0858d2315c2c3a7afbb80bf506af7c,16.25;0,50;0,50;6d62180c99b98fec91c98eb0160cf843,35;6d9999360dac7d871a242a18a649d7da,16.25;6db50b1e28f7f2d2420d3a96d9c73de2,165;0,50;6e22d722d4f2a68b69b1de8bae5a92f3,6.25;6e6e677dedd9e7d963f3036a6909854f,2.5;6e78106831ab0ff94589bebe9aaac661,0;0,50;6eaceb05c6f402c7b9bfc4f5e5f0bafd,22.5;0,50;0,50;6f3f5c0d930dad38776fb3b55c328c52,0;6f4d373809620f9e515deac5d1570a38,30;6f4dc5b48ec0104dca18d50ceb483fce,70;6fa8135e25b9e32432dc3394dcdebfb8,0;6fafc54550ec87d1366a7fe550f4100e,1.25;6fbbbe52d64484642c2c7c1391a1173f,30;6fbd4ee33b849c4984ce508772a3aa44,30;6fbf64ba5ac7bc486cc7a9b1599cbee8,35;6fdef419a9d36926fd707131a7fd7e53,1.25;6fe6f18a943659ad768f83556a2637af,8.75;6fef768a3a12d4fbbf71293346bb3fa2,60;70037377bd15b64f35b09c6d2d16e093,45;70101227944feb1c123e680507e032a7,8.75;7017451628abfb338d625317d6573374,60;0,50;7021da658effc8257e6c7d548ab5f85d,3.75;704111d3ea3e0edc73176bc1c15ff02e,0;705055dd4d71d2b56109235b0092ccfa,2.5;707135366333d87d602449754638c691,6.25;70748579e6a56dcb1519f81fedae298e,22.5;7078b7e5ecbf56d860f21a62f107b63a,11.25;707e43d51e302fae085b4a2a8e61f964,18.75;7092e0a5cb6a2137b9493b540610a791,1.25;0,50;709dddd8d73e15bae7e72bf1ebe45570,1.25;70af88747de330d2f82c3d97e9954d5d,0;70b4c3e128808d7b2558fe30fe36a5a7,16.25;0,50;710e8ae0644134096d0b8896d1f22319,0;711b7a66a69cc0a199f6a8685f1bd2ca,20;7122bc6cf04c46488c8a72f205995dd3,30;7125c79acf0970533f7bdbbbb6b6ad4a,65;0,50;0,50;71bd1d426829c297065d9f89a1a4c54a,8.75;71c3678da972f0aa70a913f0cd2992c8,0;0,50;71e89425d98117eba0b2e86a5e517803,90;0,50;0,50;7223e6551a9df0b14e6ebcb991375736,30;72298acdf7f6a23a801a94d5886d666d,1200;72577fdbd28a8df77b6b94e9c6ea226c,8.75;0,50;725b0f449e07f3fca83f2e4077c254a3,0;7262a5bb0696362a2a81e4f42a5c4c65,23.75;727aa043ebcd8eff51af41145cde178a,1.25;727f64f317c5de1446a67aab8e613b12,2.5;72b823c364e92081f0dbf48b954984ad,0;72e9ab7d146741fa721798b5af7f8306,1.25;72f67a25ad2dc9e76d746c5b04b2d49f,0;0,50;73461d3d3a5bfe972b9328a202c6b794,35;0,50;73510d2e73dc738bfc369ede1395e26d,17.5;736337c40f279a4eb1b0cd2e52d51e81,125;0,50;7381178f675b3e95222cb91067819a6e,50;738d1fc87e2ea866d98ae4266417cdd9,45;73ad01ad1684fc2be1b231563c5c5476,5;0,50;0,50;73e059a367496491b62d3a9e5f5867f1,80;0,50;7405df90cf38e7f7ee1b38a6990a809a,40;0,50;7467b330fd6b1f14d368503a950a7082,3.75;74a5319a4ff7a6b5b392886ec38a188b,1.25;74d182ef76759c42aff1b0c5bd879abc,1.25;74dfe1aa2995bf42676aa43f4478e101,30;0,50;752bbb4e0821d53e1e29e78602b72f3a,190;755be60e1ff4e40e747a6bd1ffe3ff49,55;756f4ee619de3d57ae3c9eeb44886926,25;0,50;757b02cee20ff252bcc5df3fb8f74088,130;75aa5b78345db2418e611e03580fc1f4,25;0,50;75de206305693b235a3ea07e1fa3103c,23.75;76256e0658aefe12372fa0efc3164c58,0;765643d898f921eac4ded58b89480cf8,0;76615dbd99842df4e8a68485de6d3b08,1.25;7675a465cecfd3530bd8e59a0261d1e0,5;0,50;0,50;76bd842334ff582d17899ef199708174,30;76bd8d84f8791c4bbfcb5f125960e0e5,3.75;76dc530502c89e5e4c0bed3fd15a8cfc,0;7709ae45eebc0215c84254539bda3cc1,2.5;772fcf047c0680bd8cedddc076fddf3a,2.5;0,50;77bb5c1d5ccf77312956101a5a2d5a13,11.25;77e8b5f5fe415a06ddc0f23d0b612715,55;77eb1a0c52a6eef5598838addc95c0d2,0;0,50;0,50;0,50;7843a14fc0e33e8b357c7febdd0ed3b1,2.5;78b3d3989a1bac2d9460227106642568,40;78b6f7c2bd410d5630adf0f818ffd2fd,2.5;78cca06accc3dd010c21839794a9f64c,100;0,50;78ecb33dc418ea29710b3cbcbb28fc5f,0;79170ca1effc2241932448a56497d2d1,2.5;791d37c59e6a69a16a7435eaee15a293,0;0,50;79404d3178533611e055ec6ce217febe,1.25;7987115b986329432dc76534bafe4e6f,70;0,50;79aa2f78dd3b498256329f38a3d0dd26,50;0,50;0,50;79c8043a8357e8d3bd7896ece94b2a75,6.25;79d2fe7ce53e9da58e46057dcf8a77fd,8.75;0,50;0,50;7a59adff9cc83bb250c799707b471f27,30;7a77ef9b53332b33f6b3da7d272fe9f3,5;7a914235a608c65081b80c042d791e62,8.75;7ace61f1014802fe81b54a3010a9df33,205;0,50;0,50;7b22c13c3215b6079b660516f49a48fb,1.25;7b67d6f60db3c7b6ca522f4053b3fb8d,17.5;7b959ab7a07f69bee9298d6e02bd279f,1.25;0,50;7be62091e23690131599b78a407a71d4,16.25;0,50;7c3d563b0a7c3add154b3898cb680fbb,1.25;7c5f972b68e36a5d77a769ed02b4654f,3.75;0,50;7cb8b976e88ac39ae432804a958e01d8,65;7cc14c02800fa9f735a5ac24bd97c5e1,18.75;0,50;7d0916a83604d236f3b16920fa7abaf4,130;7d0d73fe026d66fd4ab8d5d8da32a611,17666.67;7d55e7f404ea8e8e864ff44293955c4e,5;0,50;7dac77e698b9d2d5818e8b6ded9c9f07,2.5;7dee8104d63d1fafcb0316d99936e3fe,0;7e14853035a1ec4b8cbf5ed119905a0d,25;7e2b8f118f8ccb4dbdabe30037024beb,1.25;7e37ec0ac6f74f0003d2f8c9a6bfc257,2.5;0,50;0,50;7e9aa9011ac28c183ba83a062d0db3cf,30;7e9c3531c7c4195bd752c3bada2c8133,70;7ebf981404ad6666ef19900fdc57a28d,22.5;0,50;0,50;7f16240d40c64a3fdb4423ca4962f46e,7.5;7f29e4d3850c86c39c391c0a8d06a5c1,5;7f3b364e2389d856b66ba01b1e31d580,55;7fd9fd053ea6c0a36a9f7b3454650581,0;7ff0e4189059b5a0052024b9f76d9737,16.25;7ff7efe0736cb87c91a8ece3724fa6f3,15;7ff83ec004a31dc86b192d587ecc2cc0,445;80098a01e34612c74026aa1b8e28e5fa,40;8025034f7a1b558abe7281b01efeac5a,395;0,50;0,50;0,50;807d1e1242c7a13aae4387f17d60d917,190;808be5ba7b3ed74ee7729b81efacf34d,65;80b7efd3fa55603cc42966478cb78c68,0;80be6d1dafade67d4b22500be63f10da,1.25;0,50;0,50;810fad7a6da69dfc36b6b92998b562de,145;81227c7087fc6f129ece1f581a0c43a7,22.5;814f623b992ff570f852fb59023a4e2c,45;816962ec9fc7a2f957ae0f1cacbab185,3.75;816d4736b6196a357863cc458d98f7ee,355;81a7461a934473761f50b2293bff906d,0;81a92ab070c39bf76eb3f9a93ff38449,45;0,50;81e17b13b65a11ba2e4229baca4c28ff,1.25;8205e72f3b34b8dc8c2b8c12bce4f0b7,100;824309ae5aa6056c7d2f624735e22e96,1920;824bdc496abd278d3547a74b1e187f5c,30;82708dc6035dc5ab95a3b60768b3cf72,1.25;8276ae38c749efaf1ea86718a8b57c26,0;827c107a88077e037747e4566f42b76d,30;828806de8b5edeccf97a0c6474949d27,40;8296627e1c3a36e7b738a5ff9ae6ec99,1.25;0,50;82b97f9b6fe3c08af41b47f1a3a1a545,60;82c8cbf96c2e9b738dc6c9f126a21baf,1.25;82d3d460d700d9d25ebd320c799da24d,30;82d864c7cbbb8f26976f284158d0768d,18.75;82d9566bcdce6e595fbb96f505822b30,20;82e63a509a38e2201f08c819457df57f,190;83149ae4c6040ac57dce0b4efefa8234,1.25;8352e5f86cc7354a5f78e6c52ac51425,50;8353f971371c8ef14442c6eea1cc28f1,1.25;835ab55044fcfb6b251ea65316477544,2.5;0,50;837a7e6e8c63357e98e210c374be44ee,45;83c9e6f38a092010618cae143f592d6d,35;83f63c562e77bce0915860658199349d,40;8438a219b0732cbc80677e06744367d1,23.75;844c06c97c4561473a1964ebe92c1950,2.5;8458609bab772a46bfe99c33f88919cb,13.75;0,50;84851a8f818a50eb76f13d75091eebfe,5;0,50;84ad7a77b92b043bf29dfedf159f37a7,120;84add7fd7c247bbbebb8018d1405563d,40;0,50;0,50;84f86a1979e9010e563cb32c9f9dc795,1.25;851aecffd65c72fe5b86b9995135ac0e,0;853af9e03c6cd8dbdd8b6c058e7553b8,0;8565fc0b3981f2c9f8f776dea3a6e389,2.5;85d2fb39bd213fe70cc1ca4a48990175,23.75;85d784170cbe8b7aca0486c0759f07cf,1.25;85dccad71d6819824c320e4bae6dd168,5;85fc2169eda30a2c7182cdd1b989ae29,11.25;86033ac6c3dc972135de29848ccf07ae,1.25;0,50;0,50;865214b9ec64c1971278d6072e9c04ae,11.25;867059063c06af0c6e0e02139b346ede,23.75;8671d15b04a4995b5abe3fa7c7a046b5,1.25;0,50;869aab5ae1b4607cea502c3f1892336b,17.5;86b6adc1dd865f8112dda29f6ceda3fe,5;86b95fc21ee3fd877584235a6719baec,2.5;86d8d5c1c003ce5c64e6cd9fc209f77b,1.25;86f53023d7625df057d686ad7e0ce9ee,2480;870405e5518dc80048a6ddad44d86660,3.75;872c932dad25fe2353676ae0c4cabd2d,160;872cdbe307ff1e691f1662cfc667a99e,110;873ce4b030f4bac30909ee4b1da5c75e,1.25;87508ceceeb1bbbb783851745f37cabf,1.25;877a71bb0d710bed0fc0bd0a0abdfab6,8.75;877b5a17d915ca71838e1ad2f5832ae0,1.25;879a2cfba987d66a6aefc5c39ddd12d7,2.5;87b15299381f68c456d9f643d0de7645,7.5;87cf33d5c6955e376075b369664b2c2c,65;87f565aeef1dfb7d05953681fd76c8e8,0;87f98a3523f5a0b4cd0c7e0ca1f65a4b,1.25;880c3bf56ffb85c4f1c87f818c731825,1.25;8841e45da5fe1fc4ca36ff08815712a7,0;884aad43755491c6f2582a532aedd290,11.25;885a912ab004250d9acac308bdd45ccf,13.75;886702422e963414a67f100244e31a10,45;8873d40664afb7a2888b6996a6f1d934,0;88c3ff5d75a1ebcc557a55e377856fba,60;88d55617a02ddca5205cda9ae864508d,50;893c2358e05a568e04fd6f6895fce640,20;0,50;89a11d7381eabdd5f79aa7a39a305cde,21.25;89c03d27ba3d8fea5d79c11cf02e81dd,0;89ca38139ea44903ffc033ef3650bec3,25;89f29563670413ef999f5cd8788d9249,0;89f5b9af018c5dbe1ef962e8e90ac75c,2.5;89fce4f35d309f8836c273ef92e504de,145;8a0536862241b490f9535c1e7898d4f5,16.25;8a515cddaa85c4e801bc25940aafd0ed,1.25;8a697f1db694366187a9f39b76c69169,16.25;8a6d9a800685f5c12e29772d5f1736f1,13.75;8a729f66833fd4a5790fa0be6f43b407,18.75;8a7bea5d0bf3b94df2e25128e8296ca4,6.25;0,50;8accdb5bad8d53c63a869bd59fdb47cf,0;8ad825fc812bc4204b717d400ca7eadb,25;8addeceaf4a293953cbdd7f824655630,40;8b0489fe0870cca0a7bdf02d6527530a,1.25;8b36aba6e495729ca233c75b598e848b,1.25;8b3f6bd74b35a37d0366a530552fe968,0;0,50;8b65aa0565083dec90380d5961c632f4,0;0,50;0,50;0,50;8be05ed9d2ef0558db47ab3c436f5f70,20;8bec951f6364cb21bd80e8ab356d3286,55;0,50;8c1b89192e5c9ad449ee2f113aeb5ec4,2.5;8c2ff32c51ec8e64fb87b56e73ba67d2,6.25;8c44c95045ab874ab3528746ed508be2,2.5;8c603903f538729b857608c42c728744,1.25;8c6407908b7fb77b778c75bc3718eed3,1.25;8c7d8845cdab2ff5e78ac6ee648ee8ce,1.25;8c8744ca3866631f621851199aa79e49,18.75;8ca28f786f0d10c9cd1cf82002376593,0;8ca490434f9ce4267484fd50bca6b4b8,3.75;8cc1e7c6bfc5030c3609ac34083e92e7,1.25;8cfe9864e18db32a334b7de997f5a4f2,2.5;8d1e8747a1a646c7f151dbade2080c0d,0;8d2064a3c3770c27617e0f051b032be0,85;8d597e755c84b1c7c94576fc3fb71ff9,15;8d79c412f122c919e3ab0e9a4403a06a,220;0,50;8ea683bd15b54012632453e2bc9eec88,3.75;0,50;0,50;0,50;8ed4ce08bfd7cb8a436eef5fc3be322f,300;0,50;8f28c68d0416aedb02335227a8fa6bd5,3.75;8f2a530cf6f73647af4c680c3471ea65,18.75;8f4b9102b229931be807c600f9a39940,2.5;8f6c3ee5d5bb28b38993a36bbba99951,45;8fb9c5a279667f4f708a573177b181d7,0;8fbacfac0e9ed5531a31644db4d3d992,75;8fc591adaac5f6640de2d5231ca9a597,1.25;901a6902f3d9d9e0ad4e0615443650b5,25;0,50;9026df0876db6baa9189953a48b154c8,80;903142ea86a90491245f2db050aed14b,10;903639a81539f8914377ef81093db334,17.5;90693a20a36b40096861e10bd54c9c6f,45;906d42bcc2a97c2395b5ca63e86c9ef9,210;909f23bea314c9d6dae54a184c8f6ebc,25;90e2d1d879447e61d64721cde0ba022c,1.25;9115ebb5b5d7804845c129e3b6db4e84,30;0,50;9135d0ece716317424e7e97dfbd298dd,18.75;9161a6f065c66930d3087226c44bfb33,0;917a74b7252d8421919fb8fd95e04503,1.25;917fc4e4ccc94a357915f40a20886328,10;918b2c04316663ad3ac9497b28be3fa5,6.25;0,50;919bd42beb16cf6c1b8e661ce442a5e2,1.25;91b10f58e6bbd78a25b0d3d29b5c2b74,45;91d4293165966f36e63858d48b7f2e71,11.25;91d6e0b1fa9e6fe7d314abfefbb3d969,1.25;91eccec4234172a96844856bd5ff8445,5;92218020f781e3394c1ab563f7c197b7,125;924a190bb9827719e7c19b3107fe7fd6,30;924b67c8fae1438718e4f1a45f672256,1.25;0,50;92bb440b5971f12ac3187016335248cf,2.5;92c8569a5df359581f259b88697bce47,45;931de31c82c2eb781c9147dcab99d791,2.5;0,50;93442b07513251b6898a511448b0f4bc,0;9347d98a7f84f4661c67ded772f775f5,6.25;936557c6c8776e149c9fefc7a09076a1,40;937129ee4cb3630e5c46738eee9de716,1.25;9372be3bad2c306cc7908c971ee2f755,95;9379980588a20f5901f8e39bcec511f1,345;938d913651851c449ba9038fd9792f24,2.5;939c98982d9ed1adef26ece820a82cb9,1.25;939fc0c8146e62fd33e3afc0dfc3ff7d,0;93c8e4466049ec095ed49f3288766fca,1.25;93ceb5244472171ac60fbba931b5425d,18.75;93cf4607c73db6eab428bdfef00c8202,305;93d3db8d58f51ed195bc22fee7704f11,1.25;942f507f63bfc3d2acc6813b9f211ec0,35;942fea7c3eebcae5224ec1ee39bc4744,60;943720c9e4e032381c433dc85218eeb4,0;9444d2c0b9e95f8131857aa0a4a85767,1.25;945b7baa4d14950e26d011d1035caa30,295;947015bc3eb9a16504cd2965c61d5e9f,2.5;949b11ea5e95437e761ab3135e01d9fb,1.25;949d8ca1732fcf0c1fc03592885fc220,1.25;94bca6b48d5141b3ac0aee39f238b750,1.25;94caecac9ba0a36e7491227096e11d3c,80;94f177ac4578c2ef7eb07449f2ebd23f,45;94f5685db91571dc9427c8bcc5e18570,165;94f8a7dd4dc0f339e7a06a95d7f20f6b,12.5;9500838d2e318c0865b39a2bc50da6fd,45;951c43dea2277aa7ed5cae704776c8ce,3.75;953c793d357544378cb28b9909bf4b14,1.25;954cb52da98a631c03a8b7949fccf1db,0;0,50;0,50;9571771f896847f342404da0a27c6aaa,65;9578322bf6ed6904d031cbcef1b47fec,1.25;958ba027fc57c834e09b6c0a8720c525,22.5;95c0bffa80abceed2ee79956a72007d5,1.25;95c9eb521a131bb6ce0823f3abd5348b,20;0,50;95e2333ac75910113cf0c91bc16387f3,2.5;960cf47295873beea317d194a28e6e7b,17.5;965760845cc6d826f7356a925dc02639,5;0,50;0,50;967c3fe1bf9548e74102fd12eac5c415,1.25;96c18bb4a02d15c90224a7138a540cf7,165;96fb094c7cdfebde67e892e1abdf0299,6.25;974d2dd283bf0f3fa244b19aea3f8a4e,8.75;974e9147a71e9c605446fbf458f4e940,0;0,50;977f72ab4e75711cad31973d34d3e348,1.25;0,50;97ad757de2a58dbed7372a577537a647,35;97f0c66767b713c375065e4d5f627bff,7.5;97f2226a0a0607b5ad6414af35d3822b,6.25;985eb61cc2c1cc91446322bce97cfe81,1.25;9875b2fb19b438236448d0a58f53a93f,10;9899218c99fd054a335c949bf2b787ad,3.75;98a1b5909b653938c70966bba8d1f6b7,1.25;98c4b4e30516dabe245c354bdc32900e,21.25;98d94ac19226aafbbc08b9a8aeeec7a1,5;0,50;990f50a1c175d2799111b41a3e94ddc7,0;0,50;9932a00a946bd5be594b37fbd515bd65,11.25;9941b6bc707c57c555fb9ea38de0249c,1.25;996f951cf6784629e42d68316c67badb,6.25;997c441f7e4700499dea3802688d43b1,60;0,50;99e73e5980893dd3ef0fa40cd62c2742,50;0,50;9a05e4412e02d7eb45dcefc24a14e39e,6.25;0,50;9a2b963eea2f75326980ad6baec45c6c,8.75;9a516e998ffbcb50012f95726aebbf7f,185;9a6a96d819ec8599bc6e089a623bbc6b,1.25;9a6e86c370ed8f77ba858ec0a39cca28,2.5;9a7d7cc7743cbfbd46c10fb9af49c0d3,0;0,50;9aa6da0ccc916d31af1c01a49e879e79,65;9adc56c56dd00eba70480b41a9f5b853,1.25;9af6acde8acced8cfed406136cb7c4c7,60;9b06f2ae5a257ec5c8fb0b97b58498fd,260;9b1865a6bd3cac041f14e28e16b362c0,1.25;9b4366216e9870d5e68dd894d30463da,16.25;9b5b5d64fafa51599d6df9089b0b89b7,1.25;0,50;0,50;9b8d84ada9e5d6f3a424fc3d95df2529,3.75;9b93c87da0334b843551064d96e7a8cc,1.25;9b9479cc15df7f58fbdd39e9b844a145,2.5;9bc0e64cd2be1cce16b88052dd4263b0,2.5;9bc430dc724dac4041a8515174b72a1c,21.25;9bc8d2ac6e72e36e60ee62cac63703a8,0;9bd26aebe4841ef8d8a58ecfb2f8c0e9,1.25;0,50;9c38030605b8ba33fe4f33eaa3d27fb5,0;9c4d0ed01958c6629f88ee59b9698ad3,1.25;0,50;9c7a9918356fcd71706b66290e813b3a,3.75;0,50;9ccdb1509a91528db361258dfb7b8f13,15;9cde5e8a3063ff3dd3a8bb166810b85e,1.25;9ce6f19e20f69790601c9bf9c0b03928,0;9d1d9cc4d29e667f031fb3579b2c438d,0;0,50;9d59bbcfccd7b6008d1d06cc71c7e5b0,3.75;9d72d73334086cfc26bcc374cc5e605c,1.25;9d7ae806c4d2adb73085803b323dc583,175;9d88de6ad21612828f03e30c5f261b1f,2.5;9da1ce572047a46c7cf9c8ed0b5750d9,0;9dbd2eb638bfda3dc573a8e5f1ce7a4a,75;9dce8d5750fbdb4ccad73d2ca36491cc,3.75;9df1996b35117fae91b5e4c2b5e58da0,55;9e11265c322b34760cbfda934cda7aed,190;9e1f75d82ed70612da9ab8c896252192,25;0,50;0,50;9e55489b20a31882d5cd28b27c20d6d1,1.25;0,50;9e76ac2c2fc1ec4bbb5131e6fa5bd3c9,30;9e7773dab91402e2991ed6693c7e1b55,2.5;9e7d4a715b5ece9b6b4b3755096c287e,0;9e8ef708a0af85d2125526210a1b09ec,2.5;9ebb8337ef58e82fb58610d66b3fd0e0,1.25;9ee368d312180c16b1f1ce420d99067d,25;9f06b8972303f8a92ea6de6bbb7d3e9b,7.5;0,50;9f2fdd97fa9c48a05e9acc92d353fe51,165;9f55bb672f8875142b8c0e033e23412a,0;9f5d7eebad20f117d4f272d31bc6cfc7,105;9f8107021a0041e6f1e3281dad35edd2,1.25;9f9b938e36f7c76fd22ca717d1a122c5,10;0,50;9feee7ebc38c0e65cc7e9621ccd94bd3,0;9ff2b091f67327b7d8e5b75fb5337514,55;a01e61179405e7b8197d1ae64c5ecca0,1.25;a0462ef12d6f11deac43fb0fb3c8e86c,17.5;a06840d112d5e4f38bb2aee07e55f66b,2.5;a08d7ee9249461dba7b2118f8954ab78,40;a0a6fc891af36825ad565b4bd3e481bb,0;0,50;a0cd29783214d61a1156992554d8917c,25;a0d15c67aea509d42733de8b34093a2e,90;0,50;a0e2873abdd9e51b5fb6db6535e55b32,3.75;a125ffe948f87637f46e95a7e0602f8d,40;a143d41016594917eb15562fbd4c13c6,8.75;a14d965863860f0666915467dc995762,0;a16d8d4a3973ccbac0718046f0989521,30;a18928cbecb354d4584becce9eca6c13,0;a1a7ec74a3d57e759b536cde686b1783,85;a1bb632384f25c438a7cdfc8cf61fef0,1.25;a22d5bd1219eea1dbeecbb579140332e,45;0,50;a28a609ea96bbfbe7339aa6968d1f0a6,0;a2abc3473c6c04b559e930b8860eddd9,125;a2e48b7a0466a6166dab13ec6ca1bff5,13.75;a2f0290b48d5bf26bf6929b061a63b37,1.25;a30250fa1a0ef50fe0007c8104902f1f,1.25;a31f18125448a66891d1b7fa7cd0ca1f,1.25;a32321ad4c4e68bc654651353c811b49,1.25;a33641d2585f67df892c5df49b5c078d,7.5;a36b0f54f2e4a16c98e196271824aa4b,3.75;a39e2755d3ccee9f3dc176462abbc2f9,65;a3a40e2aac773f6559941a93dbf84b0c,23.75;a3b211057c07a294a1056bde2306d185,21.25;0,50;a3fe65d92f44b20b161d37ea8123f9e6,22.5;0,50;0,50;a414ba67c5d769da482d7c7928d1a112,0;a41bc3b54b1bd67360dafa1c849c5302,2.5;a433ca3195809625aefcd1f580658544,2.5;a457cb22fabdc732f458b08cbaa2ae55,35;0,50;a46d8cbea8b4312465e563c40e37ba88,190;a46f027711f5bc10665f3ae5d0fb6576,12.5;0,50;a4a0bcc56fc3f87168bd47bd4168cc3c,65;0,50;a4ad2bf1b6d0a92c704431c681835f62,0;a4c14e7d5df720a0ce60761b1f038ebe,1.25;a4c911b94acbefe491c74eff86200d55,2.5;0,50;0,50;0,50;a4ea31e2977ea1282eced091fa4b5713,35;a52565441ccda35464cf0d37fc9074f2,1.25;0,50;0,50;a57a2f1e3baae43b86d2d8ee3402382b,35;a5a0d2a7bc8f112fd96b5a8757e1460a,1.25;a5d8e471b08069888aa83b3c90b85a2f,2.5;a634bf74bde1366fbf40fcb87a543ca2,1.25;a65ca51c8316bf7ea9b8734436cc7a9f,0;a6a846cf62e78f73926bac0b4c914530,15;0,50;a6ead22d93ee4bcd6990c735131afe5e,7.5;0,50;a704f16709b443a7d69f46dae3a5b144,3.75;a724344aa68c31e548be784fd1315de6,5;a72de3671f89239a81b31d6f22eaeaac,18.75;0,50;a74ca5deed499696837703cefc83a465,12.5;0,50;a7a29947ccc7fa2ee5208c11e41fd3df,18.75;0,50;a7c2ade8c8adc9fa20dbdff227ddbe3a,1.25;a7c7b1ba0bb65e0f146394cc9447784a,5;a7e09bbd90b076eefe1c37de6c8ed48e,0;0,50;a8311e8a3d60fea0fd75237321594979,3.75;0,50;a86ca074987fa0cc3faa342c7f8e3b50,1.25;0,50;a88eb8379a7cff4fefe8e7f1c1777003,100;a8a06fa569f7e1660c945e525d80fa32,60;a8a8dc39a19d56b22056e749bf7e183a,1.25;a8b309319b4bc1f14326bf936740c0fe,0;a8b819e584c2e239ec02681955b362e2,6.25;a8dcc52bfe405432502d9fac62942d0e,25;a914310181ad14195a900132396544c1,10;a914eba952be5dfcf73d926b508fd5fa,8640;a92e1cf0903633d62283ea1f101a1af3,90;0,50;0,50;a95dde35d3895b73280b6d41356e882d,18.75;a982aa4401bce5673d9306cb6dda75e3,0;0,50;a9ad53bc5b800f172cbd82c399a7893d,2.5;a9bbb78a53bd09d0c8db03c8f066b22b,40;a9bc7b2387753c7c844bc7e61b91566e,1.25;a9c4e1b2658c0d9d768b2fae22ae50e4,0;a9dc57a8468f8a2a9ab997720ddb644b,3.75;aa1c62826fb9c377832292169da8b6e9,3.75;0,50;aa4e8d5c8034ea15fd48dcc77350e5a2,0;aa7a2a491a4c9401074824da31e80e6c,25;aa9d1fe2256a7b4acbd2b01cdda32262,0;ab3bbdab2853a95358fcbdac7bbd25c6,1.25;0,50;ab94b7bc3121d34456303a6ae55216ca,1.25;aba8c0c1ce4a848980e6b8968f6c2ec2,30;abd1069bf62bcdfdb598116545f1a619,2.5;abd97542ba87185962028cbba476a6d1,200;0,50;ac0197108f5d30d473524932a4be48a6,30;ac055890877ef30bf913520c616847be,1.25;ac3b104f7a72af92331928b440c422bc,12.5;ac7490e8706e8c4042d9b1279e9d69e3,85;ac8bf46b488d1e057ba12d87cc83c957,12.5;0,50;acb49921d52984b772f64edbb372ea3f,5;acc10b10ff1e7524e9437c7d6c69d75a,280;acd2b79de6dc22546ff09cb523f32cd2,12.5;acdb4c4d5407fc1d5924ae872dfd7107,0;0,50;ad25edf6f8d933d3adb8e6bec2c96e0b,1.25;ad5600a48803ae1b769481b10de7780f,2.5;0,50;ad8c5a5b7ec5c4a59e5682bf44601210,30;ad9214687bacbf598692c3e335a5f7f3,40;ad9a179dc17d3fa987bd75e3b71378cd,60;ada54ba1530f7a1da35eeffea69dc737,0;adc3eb2ed8d2b493d23454764a05ed26,23.75;adf65bc09bcd9aaa264d4f5ba19359ea,160;adf9f97e6dd40989780aec9c850a3507,1.25;ae2a04b31eb93905c803f43343ef43f2,110;ae517fa10fd6fb328a10e405155c67c8,2.5;ae519d6989ee92d547ccf3bed9a3dc92,11.25;ae51c3c4d96c1573460b621e9c636eff,17.5;0,50;aecdb1a31c390474f80269960a6e7554,35;0,50;aeed96e8131dca89a6b48b7843fa3585,13.75;af1c38f1b388a035c2d86551403c79d6,8.75;af5cf5f6c1867f07aebe79ac30271f17,420;af69a5ea70bb0019e498d01b49c9fa7d,110;af74c363e8256c31c2bb6b1e81036f43,6.25;af7ced0f604d5d564246c01a1883888d,2.5;0,50;afb18a65f36e3fdfb40abfdff18d9465,1.25;b003ccb7fb6870032b8e06afc722b29f,22.5;b0062d7045aec470cbe3da4df4e68fd7,35;b0151b1ee5b9120d200c9ce60c8d1b65,2.5;b030ad234200af452729cce82d2e61f3,6.25;b03475d1d799c030f86ba8cfefd88901,1.25;b03f006d263db8c3a2a236ad26eed373,55;0,50;0,50;b0a778e2e8b5e53f50fb27928d8ab695,245;0,50;b11e1383a0ca8efdc01343b4787456f3,30;b12b0b1af7c099ae3e185b16693868de,0;0,50;b13180e048e9d74ddcd433ad175441e6,3.75;b1346d96ccfc02780362db504f496f6b,265;b13f82b836ed9bf2f57691cee3244e8d,30;b15f2cdae1daf59f526f1693f9ceeece,235;b168a1682d6f6b584a7f39ce62836062,0;b1a9141cb44c2fe99fd7f9bd5693f820,0;b1d0940a97a70672583ee22fb93782d3,1.25;b1eb370d5351280a4e34e7c4044d3bf9,5;b1fc8162e7d4c87a9f3f02657c2a6ccb,65;0,50;b2193ff8ecd09f469f3dd08756c0e472,1.25;b2466b794ddce6d70366dcb2fb1643bd,1.25;b25561b5b84cc860263f42f1130abd7e,3.75;b2575dc73f67d71255f5314ac51364c8,30;b28ef0b6c2ceb0b0495a3d05a98593f5,65;b29e2459cad2d9aad31c18f115965f75,1.25;b2d5d0a71d91f6a113389422c0776c76,25;b2dc68c36d4480ad126526b3d15eda6e,1.25;0,50;b2e683d5cf03d198cd392bf92b4032a8,6.25;b2f5c7f5f3fb4f4d3ea014123d4386bb,3.75;b30ecea5c5b0ca174aca79952de6920e,1.25;b31c864842c3bebb80f25152facb74f6,10;b32781e071b939a1ece43414b3e26d47,1.25;b333bcf342d2731f2e54c1b5d926af99,12.5;0,50;b34b561f0b5f510dc93581b93ad53f46,6.25;0,50;b36240841e94dbaf29d803886c6f0c04,160;b3903e340e3c1a1028d483b2b0667a2d,3.75;b3962db8b6cc4036363dfe5ae7275db9,2.5;0,50;b3a1e7fde6300dacc5d63d9adad801ca,12.5;b3dc623f3dea8c64c595e756ba48aebd,1.25;0,50;b424b10aedcc61bef7479e2392b607f0,1.25;b45874e0a89d651596c7c18cd89d8804,2.5;b45c5017b7e7fbe7e7f0c672c78daf98,21.25;b461ea0ad6f85b2468aa41904603d53b,35;b48400ac220ded62db1acbc4b066a1c9,0;b48d086ec1a430a01dae25a7b1d98ae5,1.25;b4d3a28eb8f11f23941a57ce85e75277,6.25;b4e76e80c0313193767b725c763e323a,0;b500e4ffe6d55bd608d9aba62007cac0,45;b509d5c9a6dccd17e5f09f89a15264d8,1.25;0,50;0,50;0,50;0,50;0,50;b5e10faa93ed88c4f47b453d10fac9b7,0;b5f454b2ba97f071c27effccfade5518,10;0,50;b62cee6d4f1807941bee1bc80cc36aaa,25;b632801595f3f159b5b28b40cb9ff3da,2.5;b63506772e919758d70eef99e3443cf5,85;0,50;0,50;b643cdce38f04eeb90f6e45f03daed03,5;b697bbfcb028365be7f6918ac1e9407d,45;b6cdea9682421b12c02b4f13647731de,1.25;b6db9824c680138e278a681e1013bee6,8.75;0,50;b776ccf9f18b8cf291361dc12d6662d5,25;b7889a19cf219bf01205d412b076814f,155;b7a0a3abbcab708faf5b9fe810bd02a3,0;0,50;b7c492edd831e8ebe297be3cfe31d7c9,6.25;b7c805f71ca6f268ad3ae0aaa450de9f,0;b7df322e5467333d5a7a3155a48d30d3,70;b7ff0838d0db24e867f689fa52422ee8,3.75;b818c3cbcdb5c70483696c659d552e57,335;b8239d824b88c566b3ffd6c03b730bea,23.75;b837ffae734b258adde58c5ba921fc0b,105;b84e5be673dcff58e460d01d36a01e76,40;b84ec26ab43a1f2501fc77315aba2403,1.25;b858fcb0f02d895e8e9b7267db3600b7,60;b859cae986a8295617ed6d5108c5eb47,1.25;0,50;b873ec172bb68895d5f6346bcadff064,2.5;b87433f5ba606e735540c9f031b98209,12.5;b889671d094ab6040e62fe2da799626c,11.25;b89807c11a53dfa71cb72b2762d04710,16.25;0,50;b9706f29d7a6522f7a68a7627152ff32,6.25;b9959493fe44b3402f97c3f943ae86e7,0;b995db73712010cf0bd20af934150abc,1.25;ba3b677a0c10add7a97f884d8aa9205b,30;ba40858d2750cdc6f1104c81a645ef58,1.25;ba6c7b48d785785061230bedf7807ae7,17.5;ba7408ebef744206b8ede09057d079a2,11.25;ba999ecbe6f9a498861fabae3f6c37c5,70;baa2eefa36081bc3e8b9b8b90ee20d8c,13.75;baac67c78744d6227b1a5228c41820bd,13.75;bacc31c85bf4a107ee960dd9440cc2b9,2.5;bacd01143c821366687500f9e148a5d2,35;bad6a0a80491c5b2f5bd17cbfd395eb7,5;bb20208cbfcc61129f87c7e647dda84d,1.25;bb2a5ba9251d93f06ea305e1d26a38d1,1.25;bb58c7328641efe210aec477d12c88e6,1.25;0,50;0,50;0,50;0,50;0,50;0,50;bc6429ea11db5a18e556d5a50c49038b,6.25;bc6f45449edf33c2ae0ddd254c51d593,1.25;bcab56da59ba29e9694641f4f146272d,11.25;0,50;bcbc9d0ea201c4eeacae930b7e442c2f,1.25;bcf38e9cf02878882653e912cae3e683,1.25;0,50;bcfc37ef47a5b20a969f018791f1f7cf,3.75;bd1eef065111326bf9fd07d4cf6e6fc5,340;bd2d1762fda1d8361044b904e54b8afe,1.25;0,50;0,50;bd717ae76682132c9244ceeea199496b,30;bd73a30e5809c391354d67f48bdeb52d,2.5;bd74b8a57f40cf048155b0a1f681e53e,1.25;0,50;bdae3a19127a4323b98cc1f0eda1cc02,1.25;0,50;bdd600e5c31cbc96fc7307c487b9976b,1.25;be210af19352e87e87e97e85294c31b6,1.25;be4592de6391c7ac6a625b52b3962b35,45;be80b23cb27fedecff48571fcaff09aa,55;be84bc922cfd78b1d4dd49029abd4176,25;0,50;be97b8ec6af79072458cabe110c7b044,1.25;beb95ba3fa546e7c66e3e30c512b2355,25;bf25b5f8bdcabb40b572f6eee4712852,0;bf261cf83d07260c0940b5a3eeb83137,1.25;bf290719659eefbe83d30411471f7507,10;bf82f01e52a4e90a6490833e81e811c1,2.5;0,50;bfc3143a6f7122ec548aef0d4bca44e3,0;bfd4e6e64a9f79fd8fd01c6c4e770c81,650;0,50;bfdf121459720b33fa83d2c7770dbfd5,21.25;c0222eb9c021fa1591fda6b6bb0a89cb,13.75;c06664af2a4784903324689809503efd,0;c08c295934f3544eb4135b63405b123f,1.25;0,50;c0dba404454585ce1e2535559bdb9e0f,310;c0f4ca8597dd793c91ac89c801495f50,1.25;c1277afbd51d12fdbbe25d834a66ee5a,1.25;c12a1e87f383fb7e6fdc2edd6c097128,13.75;c175837ed24b4b1d1407ecef6b1ab667,35;c176e5642f12297d3fdb433de84f9822,830;c17c25f5f021a42957af31bedf6a9994,65;c1ba2ea33a74f9190177e1bac7e40431,5;c1f3fb1396318ece257b9c916ecfb18f,310;0,50;0,50;c20db07f878aedf7b0c04bd6bacc4ce3,60;0,50;c239bce0a139795e37e51a20bb8ae3dc,30;c25cf641cd41d5af8f565c077091393a,0;c261658bbe5b102deecd313e117a7015,30;c26ac599a7ff2db51705beeb944ead70,75;c26ea727fd2106cb3b3fef4d7e22e4ed,1.25;c2b4a7b9f608b794527cd15cdaba6eed,1.25;c2d1717bf74445b51f93697425839817,15;c2d3ce1e934551f89cc4f0d751370e84,0;0,50;c3074b767f96bfd75720983684025793,15;c3170a46ca0c1a681ccfefefe027ed07,25;0,50;c33a2e041ebf715a79cea6c68f910942,6.25;0,50;0,50;c37bc41c71d4e5abab03512e022d85da,25;c3845e6292dbf94b1fc9bd3ce70d45f3,0;c3963461abaa4ab13a5a5f3f2853b09f,17.5;c39c30f356f1f87007c6e11720787608,1.25;0,50;0,50;0,50;c3f4c7f511ee247988b45e5fd7617742,30;c417d71a3bb3c96c748211f47d0c0f19,0;c42ac059b20bfbd0afe568c36bec5b45,25;c43e521ab75c22903afec55505b9f1b1,110;c47018ba3d59d1f60da16a23dffb0658,1.25;c4770be6369f38a14783c48b7e5dea7b,5;c4a104885fc3d612853438d274030a2f,0;c4a2495b55d148818335f39bceb61b1c,8.75;c4b0aabb0caebb594b1da76618f40146,135;c4c652f102dcf42b627589d7d525c789,3.75;c4d048167482f20b01f180cf23122a23,20;c4db318d589144e55cfb5e96b466c4c0,17.5;c514c719a1cc8f62115c9276227ac113,1.25;c5173f65a8001fe6059fbccccc27bc4e,1.25;c51a18ab192533c5d70a08d342bf7c3e,65;c526e3cf603ed89708cf28e858aad85e,550;c55780fc7a0d44be0cffa580e77fae0a,0;c56ba004080f44227d94dac7a6b781a5,35;0,50;c5fad6dfecfa296b90a8925158c4e0a5,6.25;c60dc64585edc98b5623944982b1ec81,10;c637deacc83b5d8993a644dd12484c6b,12.5;c6b101787ad0ad59769f973c7d4966ab,1.25;0,50;c6bc916d7819e8eab9d95bad241e2435,0;c6e9086fc5a7bbf711707697fb33817d,225;c700b4aa2800eb4613fc934662812e24,1.25;c716829c59f4ef8e367f07733eb337ae,16.25;c7218b0752daed6a6ca80fcbac964c11,40;c731c9b8fac0b05cc31d9b0256af777c,0;0,50;c74e42d058cfcdbf39600d764fa3414b,1.25;c756e5563b6d8e2448efc8a0862303b8,1.25;0,50;c77a3eb2829443dc769847a4d591e7a9,0;c79db991a1bc7cb4c75ca0f1f24df7fb,2.5;c7c4dde3eff184e07d989e6e6bf75f33,1.25;c7ccda3dae6fef47946366c2661e39bb,1.25;c7cf030cbe5206f1f844ccda57fe00bd,75;c8155561cfc47848027361f577f944ce,1.25;0,50;c8251e31f31fe17f71be37f803e57a81,10;c82f000037c3fdd0394ce4fa4458cba2,17.5;c883318242324fae894a1bd18a6d44e3,0;c887daaa352145ca5f653d29252f253f,8.75;c8b9065ae71ac9f7a32d5612a0166c8f,0;0,50;0,50;c93868492b3982ba5de8d53786ca6402,7.5;0,50;c985528d26e10d6b8e26255b41c7cb51,13.75;0,50;ca1aa3d40f23899d168f0f4150a0890d,1.25;ca430c0e0bcb6692b56dd05d9af83902,40;ca4a7ebcebafc02b52dd14e62ee4cfd6,10;ca57e565b0974d98f54ebba0b6332f99,0;ca657fbf7b4d3fd03538951fb431716c,30;ca65d1dbbb67f4fc6aadaf7ab9aa704c,7.5;ca879b95370ed6a2aa5c110f04191705,35;caa5544470d2cf7a2acca74d641dd2a0,12.5;0,50;cad79df5783543aa14af8cd042586840,15;0,50;0,50;cb44d23b2c25625262ac95cfc5792b7e,75;0,50;cb61a738fa12189d9f86c75499a6b010,3.75;0,50;cb87d65dc32c31e5baf65e2c902d7cbd,45;cb9d674f651e94506d7e958d6c33dde0,1.25;0,50;0,50;cbbe01ae2c53cad990a6867a51255657,40;cbd1979bdb44004c1f60e39a1440b60d,0;0,50;cc1e0c9545fadadb2cb893ccd5c12fe8,40;0,50;0,50;0,50;cc51f625dc4fe751b2536395497e8d5c,3.75;0,50;cc83de229c1ef7c01917617eb42fe30d,1.25;cc9180bb8b4ae2228762373816a2f6df,1.25;cc9f0387941eb61ea992797c3b8448c4,11.25;0,50;cccb82cacfc5ae2141b841dfde457cee,3.75;ccee467a8990061b251b9317116ca46d,65;ccf17bd42891dbabaf6cb39c9d0f620c,10;ccf55d5679645385dd69569ed0ecea67,160;0,50;cd000f1edcd8836314cdef4419bee8ef,1.25;cd093f6b6564fa1cfb8e0a3ba8edf4b2,150;cd0d298ad7f6d5067255e31602bb79f0,2.5;cd0f1cd11b14758e973dcdfab23f2924,2.5;0,50;cd2080d1030caa8720436d5beeb47e4e,600;cd3a1c9e511731302ecb13de07abd2e1,15;0,50;cd555fcaecb704c9b5c1f746af1ea1d2,16.25;cd56c32db3da12d32336f281310d18d6,5;cd65a4ead4f98515a49d552d910b86ad,2.5;cd92b9525a14df746f32ca1f14513ffc,3.75;cd93800f551be75611cc940da9381575,1.25;0,50;cdebb7a5d0d053cc29216752a4e963d8,30;ce119a1ff7697b2654eba40ebb474d4c,17.5;ce171097a57524abef779a394f74027e,2.5;ce2a4b70c866643a115da634fc7f06fc,30;ce2e87e5bba0a9cd43d81323f86292cb,16.25;0,50;ce3b36a1b452dac04375a7f040f5bf09,0;ce80590611ae91bfc6a0f9d5abe78ca4,22.5;cef04e65569de69fd186d6dd04eab43e,7.5;cf05405e8849b470b69cd0f484f55a54,3.75;cf0ab57a90b8e5636678ed92aa92b08e,20;cf2fe6e349a5ee9499fa0e4a39428780,1.25;cf37b9889b85ef476daf8b6c7e495765,1.25;0,50;cfad046e75d87389427a1b034c5a6976,65;cfb288c7f80882f32053b9005d6674e0,10;0,50;d04faeb489d81f7aeec81c3ece576854,40;d07e1307a63d43a81694308403dc00b5,170;0,50;d0c9863fbb7dbd559e193728b113b6f8,80;d0fb25732bac5f737fbaac8e44d642c0,11.25;d1ac87f22acc49e02eca78a265da87ca,1.25;d1cce5bff444890ff305fe795cfe135e,0;d1eccdb51f04a5f810920566b0e1c7ec,10;d1fcb7b592d470788019165fe12e4aca,1.25;0,50;d220b61831401684da8455371797083c,7.5;d2256d43384f84d75809e3c30de02c54,70;d233be36cd8753d5240a67ea88534e63,10;d2973bc4e058225b6c6b8d674a587adb,2.5;0,50;d2ae4f8f2b4c17f15903b3a8af575814,0;d2ba1846426099335fd80b6014e92fb9,17.5;d2fd4fb5cda0b539bf1c01b215677cc2,10;d3166ebe9c237f34eef6882054cf8b9e,12.5;0,50;d3592ac732396dd67badd52d8179c0b6,25;d35a8d91b8c4d10a81223659c22648da,25;0,50;d370810314d56947fd409f3bac101f68,8.75;0,50;d3c4798b11f2ec3db9beeda4b626d55a,60;d3d915defdbe52a1883248cde241abb0,13.75;d3e0f595285bbf2861152ca9155aca50,25;d3f0c05f966ee25082508fb4312d144f,1.25;d3fc54191cda7c051b98b43a63aa2138,18.75;0,50;0,50;d4240940bca1728806404374628a94ce,60;d43ebeeed072f2fc1f319dcbbdc75afe,25;d444f9fe88f2090a3849de99fa2b2cd3,180;d4a3d5ce7156f0d1df4facda8eefeb00,40;d4d20c6261f943f219a6905c8eefea87,16.25;d4ddfa58d6dd446bc9b56c3e10a3c73f,3.75;d4e905365162436d3202686ddb030e0a,740;d50aeee27fb112d75b443b461d69dda8,0;d53c704ef532da4a5a3ccec067a820a6,30;d5442055aecdddfd13cad4502ab4b988,13.75;0,50;0,50;0,50;d570555e28a8eaa9a0dd11bc8322c913,6.25;d57b1f88653a2a0682dc38ac0dbac48d,55;0,50;d5d2a18cb59e4ee646fdc1f613fb59ca,25;d66c025649b6f364245ebebd4911849f,30;0,50;0,50;d68fba63eee863e16ea07ada91dbb1ca,1.25;0,50;d6ab669a47817d2be14e99bacfeb909a,13.75;0,50;d6eca3865584e1abee133495523d91ae,0;d6f6b5052c07f79393f9c7d480a072e6,2.5;0,50;d765d0ba0be982499d37ec2503bdfff1,6.25;d78af784aacb088a8ae3391e9b042519,30;d794a48fe6ac954c2fdf7f5d796493d9,7.5;0,50;d7c114c7247aa6ce9ca6e05167cae25b,75;d7c573668c47a2f8291e6b26fdd89e1e,7.5;d7d81a6d8f0fc797e95dac2dbebe598a,16.25;d80391a0c05e1c9ceedb74285f856684,105;d8063e963ca5e95a7761532113351538,2.5;d811112ee0c90355ed442f956bc4b5a9,0;d897a7af03f7d0cbffc725b73f94532c,240;d942b39f29225b34a89964d8eb807f5b,5;0,50;0,50;d98c249fb09259ca0c01af06e53bfa70,1.25;0,50;d9a400d3cb169759d782fd1c3e7f8737,1.25;d9a80edf50b72d71c37c947710ae8fbc,1.25;0,50;d9bb71a966fbbad06096aa65fbba302c,125;d9c4c66b39878b8c46d16cd854d96007,140;0,50;d9f155b039b7228aaeac39e2c2912a47,6.25;0,50;da2797fc982063d73cbda0fd3040292d,8.75;da5d2fd3724e90cae7042f9d97bce7ac,1.25;da7012c242d625075cd6567ad3f8f927,20;da7ddab9cd746320bd54c432afcd42f8,6.25;da928ae2f5e4d68db49a3adad0deca63,17.5;daacb150ae22fa6a8a5c9c5758700e8d,1.25;dab304d54593df6095cb318e46431fd8,0;db2147f681048bdadd89abb29316cd5c,65;db250f4451dc39632e52e157f034316d,1.25;db2a6eaec2b6ddd33bf08bfbd1b6f066,1.25;db3cf00a057e85fa2d8fa41cebca423c,30;db56b2226110fe3b9150c48e4dbe5549,0;db73605e4d2ce8191e050aaa9920ba8b,225;0,50;db7c06a43f9329b18678af84310c37d9,1.25;0,50;dbb6738b88abc133a57792a5b9687eba,15;0,50;dc388e0668eb5f840fa243f190b67ed0,5;dc595bd113c87ce124f30db28562f2db,7.5;dc5a16675b3e26c782c58eb8d9153a2f,0;0,50;0,50;dc8d6b9bb81cdbf77c16cde8ad7be576,2.5;0,50;0,50;0,50;0,50;dd81f4bdd35ad9b56f10add1332a6038,5;0,50;dd9e688a1678fe3d43528fd40125408a,435;0,50;ddd8907e136047f990e338fb8e900cad,0;0,50;ddf06989fc147d368f344119aacd9e6d,5;de0e4ddd50796fd8939cc374e7f14fb4,8.75;0,50;de2f2cafce158468e0f3ee1d5a2d46eb,35;0,50;deafe42f64d13ee6c57d8f79f6b1c7c9,10;decb378a7ce3d8bef9eb6ca94fd2d7a4,10;df1b3dac1826771584044adbb15dbe0a,1.25;df2d7e7503d83073d79b1f8fcb30e58b,120;df534d853f142580200a3eeda75c15f2,1.25;df7232dd951335d1a755ab9a4e6a3dd7,50;df7d22761815f216506930a8ef7ee981,5;df7f530c44ed255ee6684f6fd236f544,30;0,50;dfae80dc8a42940199e4051e3606ec7d,2.5;0,50;dfe216f7f2bd6dbf326b24f44c360e29,1.25;e0540c8b272b684d88ea8ce4c249dfcd,35;e0704ae07f54ae607f1f33e363fb6569,16.25;e0b20b1ccc088d2cefd7ec11f1239d4b,11.25;e0c31adda5289621ab94ca7fa271b718,0;0,50;0,50;e12f357fb11733a6e1bc6a3763e0b1c0,1.25;e1656b88687a2f7aefae0d193ebaa184,7.5;e177e7161f482279e555d4a1bb64b455,40;e1796a27e8ccc22fd482623940693700,17.5;e18ff5b8420dae26d49ec9e31b4d2c45,7.5;e19130745e8c56c8820c940fdd214a1b,18.75;0,50;e22005d619d5d1a0d2c6fbf882d3d4ae,480;e22bbcb684dcb3158b6c35a2b21273df,10;e2506ad0ff9277e852ec337d7ff86d57,120;e264291cf0ba4aafb965feaade38098f,3.75;e26766e435b8de6b16e1550ee4777927,45;e27aaf657905bd3fedc47c5570f2ee1d,18.75;e27c07aaa76212ef48770e2391633123,2.5;e2b2d51b337a559d07f7c3dfb79e32e9,2.5;e2bd93db54936cf3febcd8cf3b99fbea,400;e2cb397891774702086397ebd5376893,0;e2ce5a0ac3b1298c68f1010c0cafbeb5,115;e2e7dfc492e138dbe591bd136e447815,45;0,50;e325e988466d594d81feb3b27781a6de,0;e3302ff035030f0d2ca22f26b9c93012,6.25;e35f2e349c29296060d3f1ad52112d7d,20;e3609d2b817e65e79cdcba44c81e0538,0;e373665b11ba8869a310e5ffc8837b64,1.25;0,50;0,50;e3d2e26b764bda6c5e56338f09e5fb15,11.25;e3dbab06c42a46de0457314ca513c16e,22.5;e4027f17188b2a4ceda16cdbf1a8a965,0;e41cfa5a598151735ec6568fc94801ed,5;e41e9c4984d1640445e10bc3dd7da823,1.25;e474521b79aafeab8f5ce90a66df4aad,8.75;e47ec474e34e2256c426152b413101ac,1.25;e4b1ed8010a18456dbe158b6fdcdc0b5,1.25;0,50;e4d2d15b39f95f627094770b87e5b799,6.25;e4db42d47ed84bfbc5d492c6865bf6a9,0;e4eecfb50cae9c772fe597df7b2b8b8b,3.75;e4f4536c11db50b541309c4cc549d680,6.25;e503223b9d2ea770bef32e28c2fe3154,145;0,50;e52625f61028a2f4214a1010272c6754,8.75;e53253bd80d0c7c02ee6c8c44dc41e7b,45;e53ff8efab06a3bc0214dbf359006996,80;e546a0e0d5dc70b3819c59733ab7ff52,3.75;0,50;e59a6056bc2cbedf037e5d30fae0f293,6.25;e59d79b9fd799463f095ba14809dfde1,1.25;e5b4189e13aedee43992908678c6768a,100;e5c4f068970ea69d66293c52e7279117,50;e5cdc0c637cab4f382cbee77d9a9c2e7,55;e5d98ef2203fa1d1de8a6c618d4012e5,3.75;e5e0c31e740d02513dcc0f61f21195ca,2.5;e5e4fc4d91434914289aca9c26ebccd2,70;e602b53eba66086c5670bc7a0580598e,3.75;e60adf6eeb25da8aaf6ed2f460368189,35;e646fc78b3a208eafc93ed2a9c6fae6c,2.5;e64c6f0a50af958349a03ee08ab178f7,10;e657a1b036ef142b552530a6b1c4f000,1.25;0,50;e6baddf1b470948bc24945a53235666f,17.5;e6fc681905c70be383f241a409583e8f,2.5;e6fcd2a2a682f58c7b8dfdc1b3f511ca,1.25;e74b3cb10220fd68c13992c51944aa1a,18.75;0,50;e76d60df0d4d3a805b0c02ec1ecd97d6,0;e7b8d63b46a603066a30a11ddb09d12b,3.75;e7b92eee46f2ab71de912ca3a81ed7fb,40;e7c76a516a37c15b042f2104e64ce3a8,60;e7e1f46c60de55099250027f83047ab1,3.75;e7ee9336753c92457964dc5642157603,140;e7f90818e3e87c0bbefe83ad3cfe27e1,1800;e7fec928cdee35de86f445324c5a737d,60;e8221c27fd6cc3d013b3310e3c77f8a4,11.25;e82575126ae1757d17799801b9dba3a0,8.75;e8263087783a8e867bfe470a2c3d9d48,70;e826b4d9a8ef1f29a98c20cc1e49b740,2.5;e82bd3a56499ed19e181c47b571abf55,0;e830b1a54013d281112327170548e420,35;e831440cd7b84206cb59b5ef77009a8b,23.75;e83a29b54bc48c9744ad8d6faedae428,2.5;e853373f26dc687a2e93d3621aadda88,1.25;0,50;e87aa0e3e5883617b68779047b251f79,30;e87ef046cc85a35f3b0a195c884948e8,95;0,50;e8fa947974d4c988ae80ad58a08e48e1,3.75;e91e30977b7d4fa8f149d14d20e7dd24,6.25;0,50;e94141a22e697da191843afa05e6c904,1.25;e9495ef9260f39aeddacaa20615901f3,0;0,50;e9753d23ab741c303d0438eed79319b5,30;0,50;0,50;e9fd4e733a74f52e46d571af354613f0,1.25;ea0727f14d27e24812b5fd5344a4419d,16.25;ea0f18c16266883ae4cdb76668e8b709,13.75;0,50;ea37cf48b90fb0da5c1f67356708fbf3,7.5;ea4f828a360454b8e0037c28ab660914,3.75;0,50;ea8c491295c703b5f80845c395cb31b3,17.5;ea9eb4731e157f4f42a0787703feaa9f,1.25;eaafe5736443d064079b138a401acba5,1.25;eabf54836abe49b44a528a436878d2d3,16.25;eaf204f6018a7740499f38f046aebc1e,13.75;eaff669a66b76b28ef45536f0910770e,0;eb0968ab80847db6567668ac4ec44857,50;eb15325d77777f1b12a464fb77e92b33,22.5;eb17abc7d16b448cc0a293969c219dda,5;eb3e92107e6ee293fd7b9f4490e5c232,195;eb5c5f73284e9404bff846dcc5826055,1.25;0,50;eb809dcbabc4ad79dd59ed0e0315eb4d,1.25;ebdce453d46d7f6fda2bb84c8d4673c2,0;0,50;0,50;ec14f03fae87bfec46d1d8a0e11bbd3e,0;ec1b42453455011f6d26b5250a2eb7fe,1.25;0,50;ec59b47d79687a9ec41b0cdb0e0606d3,2.5;ec6957c5d419b45082f8c3a8ce54988a,2.5;ec8449805d56fb19486245eb2c961340,0;ec954793ff856045ed3df78ceec58d9c,170;0,50;ece77a55e80edca2e586f2a7e014b12e,0;ecfd9d1ea9efcd44fa96790459311e79,0;ed052f5ec33a2f3be76fe55705bf57c8,7.5;ed175b20c3e8ebd3607c4e53b65083bf,0;edaee446c871a16c3e4e9aa6fc895641,6.25;edd1d8b056c596eae60449a9de1040d5,0;ee0737bd4e0ca6955ac8fd75eeae34ae,3.75;ee2c8c9a73e894ec812ee0c16ebabd1d,40;ee56a9299d9b1accb9f23c3938ec14e7,0;0,50;eea3e62ef771958a7f1f1816cd7463fa,110;eeedef516fc6392b14c3968ee7ffb028,60;ef13334537e532cb9a5370a7571ed252,1.25;ef285b4434ca947168ec09b54336c68e,520;ef368a47ec318c792ea365add5f9f443,15;ef83f24a712864f1781209fb34eb0fa6,70;ef8d966919dd87939dad3d12e57a2c97,2.5;efac905a7a46c8c29fd25e56ef9ca3ed,5;efb2393c11f06d5f3773779a3430b6bd,60;efb40cd5c65bf1b472c056a34651c1df,0;0,50;efeaf597dd634038f79b48c8382baee6,200;eff724ef3f568039248fbfedb2643b67,13.75;0,50;f05fccd5308438d31a74348b726f390e,30;0,50;0,50;f0754c1f86499169dd6eac41e0760dc3,20;0,50;0,50;0,50;f0d3b07a58bd3bda83f6dcaadcda8364,2.5;0,50;0,50;f0e488d3d7532d6e4ce6a73d75f3ae67,12.5;f0edea95764d211864a91664d8383f4c,35;f10bf58f36e03780d0a50293af92cfaf,45;0,50;f140b0abe7873506ac7bf6de9f880238,0;f146924b614ffdc2d136f1d2111eaf00,10;f1716e8c0997925e02903f3d620a42e2,15;0,50;0,50;f1cda4e1a3da3b73bbe257ae33016789,2.5;f1d6e8d9fe4c2d559f1c64c9df81b5d2,35;f1f812690323f26cd060034e4a183e50,0;f216b0c43b6ca4dd82c96c9bc80fde9c,6.25;f23c5d6832cd13b654597a02407470f6,115;f249fe61b1a5393ec5b9573db5ffe603,0;0,50;f2a3de0c8699ec9f7bee3fbe3e25e9b8,1.25;0,50;f2eb91afb78475d95e118e314e48f879,60;f300094df21f5bf6f373ac7da9239aed,3.75;f305c82758d637897aa099375f5170c6,5;f308880ca618e62d5cf7b7912ca1da00,11.25;f32eb8f17277674ca22558672b671622,270;f339ee6ef7cbf22619b03bfa34e5a4a0,1.25;f34b4767ef9b5944a3c392ed4e69a7a0,30;f362f7a1cd00a16e9d91740a6723af01,15;f3bc8e8c111c75bf02069df5df2e4643,6.25;f41f66b1a3490ad155786f6ddd1f16d5,670;0,50;f46d4755f17cfaed68bf7af707b1731e,2.5;f499872d1adc698fe0145896867069e0,65;0,50;0,50;f4c2e734e30003267df86da64c670bc1,1.25;0,50;f4d70940fd6330add993460d81593b87,30;0,50;f4f801169d83eb1d4eca862edb12522a,1.25;0,50;f51b483c50a7438f647ceae05459979b,7.5;0,50;f5370e8abdeba6a9a85e690c3a080508,0;f54f51af9ccd1bb3b38fcd02e290b997,8.75;f55273555197291a829d2e88d15bc595,17.5;f557ab9342b11e3980c12f4ef72fecde,1.25;f5bc3c415aa30caf0cf987fa6200feda,30;f5cce458fb3532c38dd1757b8fbe9eca,100;f5e450ad342fb8be0e5855717df92a44,1.25;f5e5133282f34c97a70111a4a79fa110,40;f610b73eb55a4b5947da724503a8f4e4,1.25;f61973ca0b0c665ab69fcdaa164ddca2,16.25;f61bd18142e8ccfd5907f1a4e1bbcb7f,1.25;f62692de79443635fa77a13756506616,1.25;f627742aed8627f590792f711c651913,235;f62f1c9cf854337001f5479fe4ce4115,45;f636448e64b48e26aaf610a48a48bb91,35;f63b0e183a641ad9afce477e6be19d2c,90;f697feb4e17a75eded452dee9e8eaaa0,1.25;0,50;f6a5fdbf4e0742e13e3937b68ed76739,40;f6b8908b4e1f90b11fc7737745576e9e,0;f6c06728e018a2a087b0163173b5df23,1.25;f6c8aa817ca3f418a8024efcf57a47b0,80;f6d0bb6b841c35d9fd0a4c8ac085513a,5;f6e9b9c140a2363fd623bfe0048f2425,3.75;f6ea44c6b89a6e4bbb14fe2c271ee306,3.75;f6eee1f53dabdb723178a21d40ff9b66,30;f72659fbed483943f15529be3e7995c0,5;f741f32896132998d351ed7d4af46d8b,13.75;f745d4316d1f4bcaa35a9006e0375a0c,0;f7478106736d348e0a65cc8e7b612d4c,1.25;f76d9c65b2a7fdd1b25166ae9418782b,7.5;f7b0e67c24c8b4f3b40ab74e5229e2c2,1.25;0,50;0,50;0,50;0,50;f85d969512b3394e3c613af468d1d18a,3.75;f87439dbc95e4e2b1175e3ca167d1191,0;f879c988e11e41cf95a30e175ec36b03,1.25;f8ad6212e13e1ace2220547b03ab8241,35;f8b0a6058dc95edd042224b433fb8148,16.25;f8ce1bcad9522fa360cd0aee2896430f,0;f8de81a8e1677ef7566ef5ae8dedd3ea,0;f8fab9b305ab0a92b976e51b386650e6,20;f928fc0d1294eb0e30f84c3a78f0710e,1.25;0,50;f939f4c13f77cf895f88e730a71f84d4,2.5;f93f304cb0a115a0a6ff44ca70382617,0;0,50;f959e06d7e600d8c83308df529337ebd,1.25;f977703c3a06398c85ac8e34968c8b9e,13.75;f9b3222c3c184dad559ffe5d9a96a4fe,10;f9d951f6684cc848bf84e3f6d82a8346,5;0,50;fa2bdc16b2ff029a58754aa8f215a8dc,10;0,50;fa657b93230f7780255e96bfc6706508,12.5;0,50;0,50;fa9ddca42826c424790da17ce66516c8,0;faa19ea4586e0f4bc26e6b1ae9240eff,110;faaacaef940b86739122307c6f431e9f,0;fadb537b59fb0e583308c118f344a4d1,1.25;fafb051b15c210b801ef0ab91ddf3a6d,2.5;0,50;fb06b007fe0f6df268b97bbdbf84485d,30;fb3f0673803f915287cd5ac3a3394e66,18.75;fb411d4675c1a0360e132df8d41c6046,5;fb7b6e3eac813306bf7e4292b8a7d3a4,2.5;fb7c8f84f10b3047cfece557362f5aa8,7.5;fb82958a236badb38e03062ae6d3824d,1.25;fb8e05bcd40fdf70fda131d4f8b84c13,8.75;fbaa9ad38365baf185e3db993677dd25,150;fbafd481fda92df08cc3f2e2515778ec,120;fbb39e73dcda2b7b5e13410b86b789f8,25;fbdf05466d41d356c65a79fe889487a0,115;fc38b066fe61f9b30ed6598c52a7daeb,17.5;fc5a68fee2be7fd048659f9ed5b6a4a6,0;fc95227bbbb1faa342eda16273ba349e,0;0,50;fccf2906585418c2e5872d2307648574,1.25;fcde05657ae4b0f0fb6bae43b9828886,0;fcf9724f35aad0589d82d715f78e9d06,17.5;fcf9ee463557e206157a53eaaf7172f2,10;0,50;fd027184a76b0df0fdebcbfab58bf3dd,45;0,50;fd088cedd63db49029a5ce5546f554fb,5;fd218494f0ee4ee3dc880eeb84ddc586,5;fd25c3e54e51190721bbc15c5085a508,3960;fd5ef6cdb1c2611dc39e106faea20bb7,35;fd7e0fb6336dcf1f13e40e7615f4d959,35;0,50;fd8bf94446105ffa781c54414e287dc6,110;0,50;fda0739e22e485f9c8cf0fcda1ec443f,23.75;fdb1b1c8a8a9d432d7ca52c17508efb6,25;fdb8dfc010b5e72295e4abf530876ed9,55;fdc4e9c8c0ae77b5efac53572bd06fb6,1.25;0,50;fdc7e04c70a57f8963fb823f619e8964,35;fdc9f8dc8c895c58c0fea2ca0ce6f33f,70;0,50;0,50;fe049f0aef553206d250a1aad96b768d,1.25;fe43ab277aa6e250ec69786f49228feb,95;fe44ffc77e2aa4c02cda8030b56778c7,1.25;fe4779e3fd259df872637a06a5dcfdba,1.25;fe4a710fb94501cd94aabd1ed17b6a56,1.25;fe589c27312749002ad709e8550a74f9,0;fe5a5a60f8a1f286b41f262b1c7cddfc,2.5;feb61fcd66f07a1b4b6348182cd46806,3.75;feead2f7fbcac15d701b476995871850,1.25;ff21232db03e256f9318f739185ee0d8,2.5;ff23b176b8b8ca7d3fe2a6c0c66323b2,35;ff5efaa7038368c3e1a61e28f175f961,0;0,50;ff8abb632fbf890dd269aca3c2cb044a,0;ff9195b402d9fce448863768acbf1d12,22.5;ffa2c11600a224854d0d29e5a0d2ab9e,0;ffb45ad8a3dfa9c3543f836740ba0224,30;00000000000,275000;"; const std::string packed = PackBinarySuperblock(contract); const std::string unpacked = UnpackBinarySuperblock(packed); @@ -130,5 +129,10 @@ BOOST_AUTO_TEST_CASE(gridcoin_V8ShouldBeEnabledOnBlock312000InTestnet) fTestNet = was_testnet; } +BOOST_AUTO_TEST_CASE(gridcoin_cdblShouldRoundToDouble) +{ + BOOST_CHECK_EQUAL(3.14, cdbl("3.1415", 2)); +} + BOOST_AUTO_TEST_SUITE_END() From 6453e3b8d2ec9bf881486f0051373f6c716eca8b Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Thu, 12 Oct 2017 09:06:59 +0200 Subject: [PATCH 05/37] Rename cdbl -> RoundFromString and move it to util. --- src/main.cpp | 75 ++++++++++++++++--------------------- src/main.h | 1 - src/miner.cpp | 2 +- src/qt/bitcoingui.cpp | 1 - src/rpcblockchain.cpp | 62 +++++++++++++++--------------- src/test/gridcoin_tests.cpp | 7 +--- src/test/util_tests.cpp | 5 +++ src/util.cpp | 5 +++ src/util.h | 13 ++++++- 9 files changed, 87 insertions(+), 84 deletions(-) mode change 100644 => 100755 src/miner.cpp mode change 100644 => 100755 src/qt/bitcoingui.cpp mode change 100644 => 100755 src/util.cpp mode change 100644 => 100755 src/util.h diff --git a/src/main.cpp b/src/main.cpp index e5fc1c3be4..7f05098e39 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -1965,7 +1965,7 @@ int64_t GetProofOfStakeReward(uint64_t nCoinAge, int64_t nFees, std::string cpid if (sTotalSubsidy.length() > 7) { sTotalSubsidy = sTotalSubsidy.substr(0,sTotalSubsidy.length()-4) + "0124"; - nTotalSubsidy = cdbl(sTotalSubsidy,8)*COIN; + nTotalSubsidy = RoundFromString(sTotalSubsidy,8)*COIN; } } @@ -2002,7 +2002,7 @@ int64_t GetProofOfStakeReward(uint64_t nCoinAge, int64_t nFees, std::string cpid if (sTotalSubsidy.length() > 7) { sTotalSubsidy = sTotalSubsidy.substr(0,sTotalSubsidy.length()-4) + "0124"; - nTotalSubsidy = cdbl(sTotalSubsidy,8)*COIN; + nTotalSubsidy = RoundFromString(sTotalSubsidy,8)*COIN; } } @@ -2586,7 +2586,7 @@ double BlockVersion(std::string v) if (v.length() < 10) return 0; std::string vIn = v.substr(1,7); boost::replace_all(vIn, ".", ""); - double ver1 = cdbl(vIn,0); + double ver1 = RoundFromString(vIn,0); return ver1; } @@ -2699,7 +2699,7 @@ std::string UnpackBinarySuperblock(std::string sBlock) std::string sBinary = ExtractXML(sBlock,"",""); if (sBinary.empty()) return sBlock; std::string sZero = ExtractXML(sBlock,"",""); - double dZero = cdbl(sZero,0); + double dZero = RoundFromString(sZero,0); // Binary data support structure: // Each CPID consumes 16 bytes and 2 bytes for magnitude: (Except CPIDs with zero magnitude - the count of those is stored in XML node to save space) // 1234567890123456MM @@ -2748,7 +2748,7 @@ std::string PackBinarySuperblock(std::string sBlock) { std::string sPrefix = "00000000000000000000000000000000000" + ExtractValue(vSuperblock[i],",",0); std::string sCPID = sPrefix.substr(sPrefix.length()-32,32); - double magnitude = cdbl(ExtractValue("0"+vSuperblock[i],",",1),0); + double magnitude = RoundFromString(ExtractValue("0"+vSuperblock[i],",",1),0); if (magnitude < 0) magnitude=0; if (magnitude > 32767) magnitude = 32767; // Ensure we do not blow out the binary space (technically we can handle 0-65535) std::string sBinaryCPID = ConvertHexToBin(sCPID); @@ -4972,12 +4972,6 @@ std::string RetrieveMd5(std::string s1) } } -double cdbl(std::string s, int place) -{ - return Round(atof(s.c_str()), place); -} - - int GetFilesize(FILE* file) { int nSavePos = ftell(file); @@ -4988,9 +4982,6 @@ int GetFilesize(FILE* file) return nFilesize; } - - - bool WriteKey(std::string sKey, std::string sValue) { // Allows Gridcoin to store the key value in the config file. @@ -5978,7 +5969,7 @@ double ExtractMagnitudeFromExplainMagnitude() { std::string sSubMag = vMyMag[1]; sSubMag = strReplace(sSubMag," ",""); - double dMag = cdbl("0"+sSubMag,0); + double dMag = RoundFromString("0"+sSubMag,0); return dMag; } } @@ -6000,8 +5991,8 @@ bool VerifyExplainMagnitudeResponse() double dMag = ExtractMagnitudeFromExplainMagnitude(); if (dMag==0) { - WriteCache("maginvalid","invalid",RoundToString(cdbl("0"+ReadCache("maginvalid","invalid"),0),0),GetAdjustedTime()); - double failures = cdbl("0"+ReadCache("maginvalid","invalid"),0); + WriteCache("maginvalid","invalid",RoundToString(RoundFromString("0"+ReadCache("maginvalid","invalid"),0),0),GetAdjustedTime()); + double failures = RoundFromString("0"+ReadCache("maginvalid","invalid"),0); if (failures < 10) { msNeuralResponse = ""; @@ -6030,14 +6021,14 @@ bool SecurityTest(CNode* pfrom, bool acid_test) bool PreventCommandAbuse(std::string sNeuralRequestID, std::string sCommandName) { bool bIgnore = false; - if (cdbl("0"+ReadCache(sCommandName,sNeuralRequestID),0) > 10) + if (RoundFromString("0"+ReadCache(sCommandName,sNeuralRequestID),0) > 10) { if (fDebug10) printf("Ignoring %s request for %s",sCommandName.c_str(),sNeuralRequestID.c_str()); bIgnore = true; } if (!bIgnore) { - WriteCache(sCommandName,sNeuralRequestID,RoundToString(cdbl("0"+ReadCache(sCommandName,sNeuralRequestID),0),0),GetAdjustedTime()); + WriteCache(sCommandName,sNeuralRequestID,RoundToString(RoundFromString("0"+ReadCache(sCommandName,sNeuralRequestID),0),0),GetAdjustedTime()); } return bIgnore; } @@ -6764,7 +6755,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, { // To prevent abuse, only respond to a certain amount of explainmag requests per day per cpid bool bIgnore = false; - if (cdbl("0"+ReadCache("explainmag",neural_request_id),0) > 10) + if (RoundFromString("0"+ReadCache("explainmag",neural_request_id),0) > 10) { if (fDebug10) printf("Ignoring explainmag request for %s",neural_request_id.c_str()); pfrom->Misbehaving(1); @@ -6772,7 +6763,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } if (!bIgnore) { - WriteCache("explainmag",neural_request_id,RoundToString(cdbl("0"+ReadCache("explainmag",neural_request_id),0),0),GetAdjustedTime()); + WriteCache("explainmag",neural_request_id,RoundToString(RoundFromString("0"+ReadCache("explainmag",neural_request_id),0),0),GetAdjustedTime()); // 7/11/2015 - Allow linux/mac to make neural requests #if defined(WIN32) && defined(QT_GUI) neural_response = qtExecuteDotNetStringFunction("ExplainMag",neural_request_id); @@ -7189,16 +7180,16 @@ MiningCPID DeserializeBoincBlock(std::string block, int BlockVersion) surrogate.projectname = s[1]; boost::to_lower(surrogate.projectname); surrogate.aesskein = s[2]; - surrogate.rac = cdbl(s[3],0); - surrogate.pobdifficulty = cdbl(s[4],6); - surrogate.diffbytes = (unsigned int)cdbl(s[5],0); + surrogate.rac = RoundFromString(s[3],0); + surrogate.pobdifficulty = RoundFromString(s[4],6); + surrogate.diffbytes = (unsigned int)RoundFromString(s[5],0); surrogate.enccpid = s[6]; surrogate.encboincpublickey = s[6]; surrogate.encaes = s[7]; - surrogate.nonce = cdbl(s[8],0); + surrogate.nonce = RoundFromString(s[8],0); if (s.size() > 9) { - surrogate.NetworkRAC = cdbl(s[9],0); + surrogate.NetworkRAC = RoundFromString(s[9],0); } if (s.size() > 10) { @@ -7206,15 +7197,15 @@ MiningCPID DeserializeBoincBlock(std::string block, int BlockVersion) } if (s.size() > 11) { - surrogate.ResearchSubsidy = cdbl(s[11],2); + surrogate.ResearchSubsidy = RoundFromString(s[11],2); } if (s.size() > 12) { - surrogate.LastPaymentTime = cdbl(s[12],0); + surrogate.LastPaymentTime = RoundFromString(s[12],0); } if (s.size() > 13) { - surrogate.RSAWeight = cdbl(s[13],0); + surrogate.RSAWeight = RoundFromString(s[13],0); } if (s.size() > 14) { @@ -7222,7 +7213,7 @@ MiningCPID DeserializeBoincBlock(std::string block, int BlockVersion) } if (s.size() > 15) { - surrogate.Magnitude = cdbl(s[15],0); + surrogate.Magnitude = RoundFromString(s[15],0); } if (s.size() > 16) { @@ -7234,7 +7225,7 @@ MiningCPID DeserializeBoincBlock(std::string block, int BlockVersion) } if (s.size() > 18) { - surrogate.InterestSubsidy = cdbl(s[18],subsidy_places); + surrogate.InterestSubsidy = RoundFromString(s[18],subsidy_places); } if (s.size() > 19) { @@ -7254,19 +7245,19 @@ MiningCPID DeserializeBoincBlock(std::string block, int BlockVersion) } if (s.size() > 23) { - surrogate.ResearchSubsidy2 = cdbl(s[23],subsidy_places); + surrogate.ResearchSubsidy2 = RoundFromString(s[23],subsidy_places); } if (s.size() > 24) { - surrogate.ResearchAge = cdbl(s[24],6); + surrogate.ResearchAge = RoundFromString(s[24],6); } if (s.size() > 25) { - surrogate.ResearchMagnitudeUnit = cdbl(s[25],6); + surrogate.ResearchMagnitudeUnit = RoundFromString(s[25],6); } if (s.size() > 26) { - surrogate.ResearchAverageMagnitude = cdbl(s[26],2); + surrogate.ResearchAverageMagnitude = RoundFromString(s[26],2); } if (s.size() > 27) { @@ -7528,8 +7519,8 @@ void HarvestCPIDs(bool cleardata) InitializeProjectStruct(structcpid); int64_t elapsed = GetTimeMillis()-nStart; if (fDebug3) printf("Enumerating boinc local project %s cpid %s valid %s, elapsed %f ",structcpid.projectname.c_str(),structcpid.cpid.c_str(),YesNo(structcpid.Iscpidvalid).c_str(),(double)elapsed); - structcpid.rac = cdbl(rac,0); - structcpid.verifiedrac = cdbl(rac,0); + structcpid.rac = RoundFromString(rac,0); + structcpid.verifiedrac = RoundFromString(rac,0); std::string sLocalClientEmailHash = RetrieveMd5(email); if (email_hash != sLocalClientEmailHash) @@ -7544,8 +7535,8 @@ void HarvestCPIDs(bool cleardata) structcpid.errors = "CPID calculation invalid. Check e-mail address and try resetting the boinc project."; } - structcpid.utc = cdbl(utc,0); - structcpid.rectime = cdbl(rectime,0); + structcpid.utc = RoundFromString(utc,0); + structcpid.rectime = RoundFromString(rectime,0); double currenttime = GetAdjustedTime(); double nActualTimespan = currenttime - structcpid.rectime; structcpid.age = nActualTimespan; @@ -7739,7 +7730,7 @@ MiningCPID GetMiningCPID() void TrackRequests(CNode* pfrom,std::string sRequestType) { std::string sKey = "request_type" + sRequestType; - double dReqCt = cdbl(ReadCache(sKey,NodeAddress(pfrom)),0) + 1; + double dReqCt = RoundFromString(ReadCache(sKey,NodeAddress(pfrom)),0) + 1; WriteCache(sKey,NodeAddress(pfrom),RoundToString(dReqCt,0),GetAdjustedTime()); if ( (dReqCt > 20 && !OutOfSyncByAge()) ) { @@ -8656,7 +8647,7 @@ std::string GetQuorumHash(const std::string& data) if(sCPID.size() != 32) continue; - double dMag = cdbl(vRow[1],0); + double dMag = RoundFromString(vRow[1],0); sHashIn += CPIDHash(dMag, sCPID) + ""; } @@ -8755,7 +8746,7 @@ bool IsSuperBlock(CBlockIndex* pIndex) double SnapToGrid(double d) { double dDither = .04; - double dOut = cdbl(RoundToString(d*dDither,3),3) / dDither; + double dOut = RoundFromString(RoundToString(d*dDither,3),3) / dDither; return dOut; } diff --git a/src/main.h b/src/main.h index 2586dca6d3..809a4f8160 100755 --- a/src/main.h +++ b/src/main.h @@ -261,7 +261,6 @@ bool OutOfSyncByAge(); bool NeedASuperblock(); std::string GetQuorumHash(const std::string& data); std::string ReadCache(std::string section, std::string key); -double cdbl(std::string s, int place); std::string GetNeuralNetworkSupermajorityHash(double& out_popularity); std::string PackBinarySuperblock(std::string sBlock); std::string UnpackBinarySuperblock(std::string sBlock); diff --git a/src/miner.cpp b/src/miner.cpp old mode 100644 new mode 100755 index b2c022ab83..8b0a3dbb10 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -678,7 +678,7 @@ int AddNeuralContractOrVote(const CBlock &blocknew, MiningCPID &bb) if(!NeedASuperblock()) return printf("AddNeuralContractOrVote: not Needed\n"); - int pending_height = cdbl(ReadCache("neuralsecurity","pending"),0); + int pending_height = RoundFromString(ReadCache("neuralsecurity","pending"),0); /* Add our Neural Vote */ bb.NeuralHash = sb_hash; diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp old mode 100644 new mode 100755 index 7e98a98d3c..f0f4035ba8 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -122,7 +122,6 @@ json_spirit::Array GetJSONPollsReport(bool bDetail, std::string QueryByTitle, st extern int64_t IsNeural(); -double cdbl(std::string s, int place); std::string getfilecontents(std::string filename); int nRegVersion; diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 2cf5574739..80c09b6d20 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -665,7 +665,7 @@ double GetSuperblockMagnitudeByCPID(std::string data, std::string cpid) if (vSuperblock[i].length() > 1) { std::string sTempCPID = ExtractValue(vSuperblock[i],",",0); - double magnitude = cdbl(ExtractValue("0"+vSuperblock[i],",",1),0); + double magnitude = RoundFromString(ExtractValue("0"+vSuperblock[i],",",1),0); boost::to_lower(sTempCPID); boost::to_lower(cpid); // For each CPID in the contract @@ -748,7 +748,7 @@ bool TallyMagnitudesInSuperblock() if (vSuperblock[i].length() > 1) { std::string cpid = ExtractValue(vSuperblock[i],",",0); - double magnitude = cdbl(ExtractValue(vSuperblock[i],",",1),0); + double magnitude = RoundFromString(ExtractValue(vSuperblock[i],",",1),0); if (cpid.length() > 10) { StructCPID stCPID = GetInitializedStructCPID2(cpid,mvDPORCopy); @@ -801,7 +801,7 @@ bool TallyMagnitudesInSuperblock() if (vProjects[i].length() > 1) { std::string project = ExtractValue(vProjects[i],",",0); - double avg = cdbl(ExtractValue("0" + vProjects[i],",",1),0); + double avg = RoundFromString(ExtractValue("0" + vProjects[i],",",1),0); if (project.length() > 1) { StructCPID stProject = GetInitializedStructCPID2(project,mvNetworkCopy); @@ -809,7 +809,7 @@ bool TallyMagnitudesInSuperblock() stProject.AverageRAC = avg; //As of 7-16-2015, start pulling in Total RAC totalRAC = 0; - totalRAC = cdbl("0" + ExtractValue(vProjects[i],",",2),0); + totalRAC = RoundFromString("0" + ExtractValue(vProjects[i],",",2),0); stProject.rac = totalRAC; mvNetworkCopy[project]=stProject; TotalProjects++; @@ -835,7 +835,7 @@ bool TallyMagnitudesInSuperblock() if (vQ[i].length() > 1) { std::string symbol = ExtractValue(vQ[i],",",0); - double price = cdbl(ExtractValue("0" + vQ[i],",",1),0); + double price = RoundFromString(ExtractValue("0" + vQ[i],",",1),0); WriteCache("quotes",symbol,RoundToString(price,2),GetAdjustedTime()); if (fDebug3) printf("symbol %s price %f ",symbol.c_str(),price); @@ -1236,7 +1236,7 @@ Value execute(const Array& params, bool fHelp) return results; } - double dAmount = cdbl(sAmount,6); + double dAmount = RoundFromString(sAmount,6); if (dAmount == 0 || dAmount < 0) { @@ -1448,7 +1448,7 @@ Value execute(const Array& params, bool fHelp) std::string sAmount = vReward[1]; if (sAddress.length() > 10 && sAmount.length() > 0) { - double dAmount = cdbl(sAmount,4); + double dAmount = RoundFromString(sAmount,4); if (dAmount > 0) { CBitcoinAddress address(sAddress); @@ -1785,7 +1785,7 @@ Value execute(const Array& params, bool fHelp) printf("CPIDAge %f,StakeAge %f,Poll Duration %f \r\n",cpid_age,stake_age,poll_duration); - double dShareType= cdbl(GetPollXMLElementByPollTitle(Title,"",""),0); + double dShareType= RoundFromString(GetPollXMLElementByPollTitle(Title,"",""),0); // Share Type 1 == "Magnitude" // Share Type 2 == "Balance" @@ -1849,12 +1849,12 @@ Value execute(const Array& params, bool fHelp) { std::string Title = params[1].get_str(); std::string Days = params[2].get_str(); - double days = cdbl(Days,0); + double days = RoundFromString(Days,0); std::string Question = params[3].get_str(); std::string Answers = params[4].get_str(); std::string ShareType = params[5].get_str(); std::string sURL = params[6].get_str(); - double sharetype = cdbl(ShareType,0); + double sharetype = RoundFromString(ShareType,0); if (Title=="" || Question == "" || Answers == "") { entry.push_back(Pair("Error","You must specify a Poll Title, Poll Question and Poll Answers.")); @@ -2853,7 +2853,7 @@ bool PollExists(std::string pollname) bool PollExpired(std::string pollname) { std::string contract = GetPollContractByTitle("poll",pollname); - double expiration = cdbl(ExtractXML(contract,"",""),0); + double expiration = RoundFromString(ExtractXML(contract,"",""),0); return (expiration < (double)GetAdjustedTime()) ? true : false; } @@ -2862,7 +2862,7 @@ bool PollCreatedAfterSecurityUpgrade(std::string pollname) { // If the expiration is after July 1 2017, use the new security features. std::string contract = GetPollContractByTitle("poll",pollname); - double expiration = cdbl(ExtractXML(contract,"",""),0); + double expiration = RoundFromString(ExtractXML(contract,"",""),0); return (expiration > 1498867200) ? true : false; } @@ -2870,7 +2870,7 @@ bool PollCreatedAfterSecurityUpgrade(std::string pollname) double PollDuration(std::string pollname) { std::string contract = GetPollContractByTitle("poll",pollname); - double days = cdbl(ExtractXML(contract,"",""),0); + double days = RoundFromString(ExtractXML(contract,"",""),0); return days; } @@ -3102,8 +3102,8 @@ std::string GetProvableVotingWeightXML() double ReturnVerifiedVotingBalance(std::string sXML, bool bCreatedAfterSecurityUpgrade) { std::string sPayload = ExtractXML(sXML,"",""); - double dTotalVotedBalance = cdbl(ExtractXML(sPayload,"",""),2); - double dLegacyBalance = cdbl(ExtractXML(sXML,"",""),0); + double dTotalVotedBalance = RoundFromString(ExtractXML(sPayload,"",""),2); + double dLegacyBalance = RoundFromString(ExtractXML(sXML,"",""),0); if (fDebug10) printf(" \r\n Total Voted Balance %f, Legacy Balance %f \r\n",(float)dTotalVotedBalance,(float)dLegacyBalance); @@ -3122,7 +3122,7 @@ double ReturnVerifiedVotingBalance(std::string sXML, bool bCreatedAfterSecurityU std::string sXmlSig = ExtractXML(vXML[x],"",""); std::string sXmlMsg = ExtractXML(vXML[x],"",""); std::string sScriptPubKeyXml = ExtractXML(vXML[x],"",""); - int32_t iPos = cdbl(sPos,0); + int32_t iPos = RoundFromString(sPos,0); std::string sPubKey = ExtractXML(vXML[x],"",""); if (!sPubKey.empty() && !sAmt.empty() && !sPos.empty() && uTXID > 0) { @@ -3166,7 +3166,7 @@ double ReturnVerifiedVotingBalance(std::string sXML, bool bCreatedAfterSecurityU double ReturnVerifiedVotingMagnitude(std::string sXML, bool bCreatedAfterSecurityUpgrade) { - double dLegacyMagnitude = cdbl(ExtractXML(sXML,"",""),2); + double dLegacyMagnitude = RoundFromString(ExtractXML(sXML,"",""),2); if (!bCreatedAfterSecurityUpgrade) return dLegacyMagnitude; std::string sMagXML = ExtractXML(sXML,"",""); @@ -3180,7 +3180,7 @@ double ReturnVerifiedVotingMagnitude(std::string sXML, bool bCreatedAfterSecurit if (pblockindexMagnitude) { bool fResult = VerifyCPIDSignature(sXmlCPID, sXmlBlockHash, sXmlSigned); - bool fAudited = (cdbl(RoundToString(pblockindexMagnitude->nMagnitude,2),0)==cdbl(sMagnitude,0) && fResult); + bool fAudited = (RoundFromString(RoundToString(pblockindexMagnitude->nMagnitude,2),0)==RoundFromString(sMagnitude,0) && fResult); if (fAudited) return (double)pblockindexMagnitude->nMagnitude; } } @@ -3232,7 +3232,7 @@ Array GetJsonUnspentReport() bool fResult = VerifyCPIDSignature(sXmlCPID, sXmlBlockHash, sXmlSigned); entry.push_back(Pair("Historical Magnitude",pblockindexMagnitude->nMagnitude)); entry.push_back(Pair("Signature Valid",fResult)); - bool fAudited = (cdbl(RoundToString(pblockindexMagnitude->nMagnitude,2),0)==cdbl(sMagnitude,0) && fResult); + bool fAudited = (RoundFromString(RoundToString(pblockindexMagnitude->nMagnitude,2),0)==RoundFromString(sMagnitude,0) && fResult); entry.push_back(Pair("Magnitude Audited",fAudited)); results.push_back(entry); @@ -3327,7 +3327,7 @@ Array GetJsonUnspentReport() std::string sXmlMsg = ExtractXML(vXML[x],"",""); std::string sScriptPubKeyXml = ExtractXML(vXML[x],"",""); - int32_t iPos = cdbl(sPos,0); + int32_t iPos = RoundFromString(sPos,0); std::string sPubKey = ExtractXML(vXML[x],"",""); if (!sPubKey.empty() && !sAmt.empty() && !sPos.empty() && uTXID > 0) @@ -3417,7 +3417,7 @@ Array GetJsonVoteDetailsReport(std::string pollname) const std::string& GRCAddress = ExtractXML(contract,"",""); const std::string& CPID = ExtractXML(contract,"",""); - double dShareType = cdbl(GetPollXMLElementByPollTitle(Title,"",""),0); + double dShareType = RoundFromString(GetPollXMLElementByPollTitle(Title,"",""),0); std::string sShareType= GetShareType(dShareType); std::string sURL = ExtractXML(contract,"",""); @@ -3486,8 +3486,8 @@ Array GetJSONPollsReport(bool bDetail, std::string QueryByTitle, std::string& ou total_shares=0; std::string BestAnswer; double highest_share = 0; - std::string ExpirationDate = TimestampToHRDate(cdbl(Expiration,0)); - std::string sShareType = GetShareType(cdbl(ShareType,0)); + std::string ExpirationDate = TimestampToHRDate(RoundFromString(Expiration,0)); + std::string sShareType = GetShareType(RoundFromString(ShareType,0)); std::string TitleNarr = "Poll #" + RoundToString((double)iPollNumber,0) + " (" + ExpirationDate + " ) - " + sShareType; @@ -3503,7 +3503,7 @@ Array GetJSONPollsReport(bool bDetail, std::string QueryByTitle, std::string& ou for (const std::string& answer : vAnswers) { double participants=0; - double dShares = VotesCount(Title, answer, cdbl(ShareType,0),participants); + double dShares = VotesCount(Title, answer, RoundFromString(ShareType,0),participants); if (dShares > highest_share) { highest_share = dShares; @@ -3834,7 +3834,7 @@ Array MagnitudeReportCSV(bool detail) for (unsigned int i = 0; i < vCPIDTimestamps.size(); i++) { - double dTime = cdbl(vCPIDTimestamps[i],0); + double dTime = RoundFromString(vCPIDTimestamps[i],0); std::string sResearchAmount = vCPIDPayments[i]; std::string sPaymentDate = DateTimeStrFormat("%m-%d-%Y %H:%M:%S", dTime); std::string sInterestAmount = vCPIDInterestPayments[i]; @@ -4235,7 +4235,7 @@ Value listitem(const Array& params, bool fHelp) entry.push_back(Pair("Mag Out For 450",subsidy)); if (args.length() > 1) { - double myrac=cdbl(args,0); + double myrac=RoundFromString(args,0); subsidy = LederstrumpfMagnitude2(myrac, GetAdjustedTime()); entry.push_back(Pair("Mag Out",subsidy)); } @@ -4434,7 +4434,7 @@ json_spirit::Value rpc_getblockstats(const json_spirit::Array& params, bool fHel throw runtime_error( "getblockstats mode [startheight [endheight]]\n" "Show stats on what wallets and cpids staked recent blocks.\n"); - long mode= cdbl(params[0].get_str(),0); + long mode= RoundFromString(params[0].get_str(),0); (void)mode; //TODO long lowheight= 0; long highheight= INT_MAX; @@ -4443,20 +4443,20 @@ json_spirit::Value rpc_getblockstats(const json_spirit::Array& params, bool fHel { if(params.size()>=2) { - lowheight= cdbl(params[1].get_str(),0); + lowheight= RoundFromString(params[1].get_str(),0); maxblocks= INT_MAX; } if(params.size()>=3) - highheight= cdbl(params[2].get_str(),0); + highheight= RoundFromString(params[2].get_str(),0); } else if(mode==1) { /* count highheight */ maxblocks= 30000; if(params.size()>=2) - maxblocks= cdbl(params[1].get_str(),0); + maxblocks= RoundFromString(params[1].get_str(),0); if(params.size()>=3) - highheight= cdbl(params[2].get_str(),0); + highheight= RoundFromString(params[2].get_str(),0); } else throw runtime_error("getblockstats: Invalid mode specified"); CBlockIndex* cur; diff --git a/src/test/gridcoin_tests.cpp b/src/test/gridcoin_tests.cpp index 90d156b013..68f146e273 100755 --- a/src/test/gridcoin_tests.cpp +++ b/src/test/gridcoin_tests.cpp @@ -16,7 +16,7 @@ extern std::string UnpackBinarySuperblock(std::string sBlock); extern std::string ConvertHexToBin(std::string a); extern std::string ConvertBinToHex(std::string a); extern bool fTestNet; -double cdbl(std::string s, int place); +double RoundFromString(std::string s, int place); namespace { @@ -129,10 +129,5 @@ BOOST_AUTO_TEST_CASE(gridcoin_V8ShouldBeEnabledOnBlock312000InTestnet) fTestNet = was_testnet; } -BOOST_AUTO_TEST_CASE(gridcoin_cdblShouldRoundToDouble) -{ - BOOST_CHECK_EQUAL(3.14, cdbl("3.1415", 2)); -} - BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp index db6c7bcc54..9210a17cdf 100755 --- a/src/test/util_tests.cpp +++ b/src/test/util_tests.cpp @@ -360,6 +360,11 @@ BOOST_AUTO_TEST_CASE(util_VerifyRoundToString) BOOST_CHECK_EQUAL("1.2346", RoundToString(1.23456789, 4)); } +BOOST_AUTO_TEST_CASE(util_RoundFromStringShouldRoundToDouble) +{ + BOOST_CHECK_EQUAL(3.14, RoundFromString("3.1415", 2)); +} + BOOST_AUTO_TEST_CASE(util_VerifySplit) { const std::string str("Hello;;My;;String;;"); diff --git a/src/util.cpp b/src/util.cpp old mode 100644 new mode 100755 index b43af441d5..7bfd820b1e --- a/src/util.cpp +++ b/src/util.cpp @@ -1462,6 +1462,11 @@ std::string RoundToString(double d, int place) return ss.str(); } +double RoundFromString(const std::string& s, int place) +{ + return Round(atof(s.c_str()), place); +} + bool Contains(const std::string& data, const std::string& instring) { return data.find(instring) != std::string::npos; diff --git a/src/util.h b/src/util.h old mode 100644 new mode 100755 index 3d7edbc22f..e85891e82b --- a/src/util.h +++ b/src/util.h @@ -200,20 +200,29 @@ void AddTimeData(const CNetAddr& ip, int64_t nTime); void runCommand(std::string strCommand); //! -//! \brief Round decimal value to N decimal places. +//! \brief Round double value to N decimal places. //! \param d Value to round. //! \param place Number of decimal places. //! double Round(double d, int place); //! -//! \brief Round a decimal value and convert it to a string. +//! \brief Round a double value and convert it to a string. //! \param d Value to round. //! \param place Number of decimal places. //! \note This always produces an output with dot as decimal separator. //! std::string RoundToString(double d, int place); +//! +//! \brief Round a double value contained in a string. +//! +//! Does \c atof on \p s and rounds the result. +//! +//! \returns \p s represented as a double rounded to \p place decimals. +//! +double RoundFromString(const std::string& s, int place); + //! //! \brief Convert any value to a string. //! \param val Value to convert. From 8b0c49b3736c544aad93574cff549b7d08917626 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Sat, 21 Oct 2017 13:12:55 -0700 Subject: [PATCH 06/37] changes --- src/init.cpp | 58 ----------------------- src/main.cpp | 50 +++++++++++--------- src/rpcblockchain.cpp | 105 ++++++++---------------------------------- 3 files changed, 48 insertions(+), 165 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 28d421db62..144f6bb80f 100755 --- a/src/init.cpp +++ b/src/init.cpp @@ -29,8 +29,6 @@ void BusyWaitForTally(); void LoadCPIDsInBackground(); bool IsConfigFileEmpty(); -std::string ToOfficialName(std::string proj); - #ifndef WIN32 #include #endif @@ -45,8 +43,6 @@ extern unsigned int nNodeLifespan; extern unsigned int nDerivationMethodIndex; extern unsigned int nMinerSleep; extern bool fUseFastIndex; -void InitializeBoincProjects(); - ////////////////////////////////////////////////////////////////////////////// // @@ -72,58 +68,6 @@ void StartShutdown() #endif } -void InitializeBoincProjects() -{ - //Initialize GlobalCPUMiningCPID - GlobalCPUMiningCPID.initialized = true; - GlobalCPUMiningCPID.cpid=""; - GlobalCPUMiningCPID.cpidv2 = ""; - GlobalCPUMiningCPID.projectname =""; - GlobalCPUMiningCPID.rac=0; - GlobalCPUMiningCPID.encboincpublickey = ""; - GlobalCPUMiningCPID.boincruntimepublickey = ""; - GlobalCPUMiningCPID.pobdifficulty = 0; - GlobalCPUMiningCPID.diffbytes = 0; - GlobalCPUMiningCPID.email = ""; - GlobalCPUMiningCPID.RSAWeight = 0; - - //Loop through projects saved in the Gridcoin Persisted Data System - std::string sType = "project"; - for(map::iterator ii=mvApplicationCache.begin(); ii!=mvApplicationCache.end(); ++ii) - { - std::string key_name = (*ii).first; - if (key_name.length() > sType.length()) - { - if (key_name.substr(0,sType.length())==sType) - { - std::string key_value = mvApplicationCache[(*ii).first]; - std::vector vKey = split(key_name,";"); - if (vKey.size() > 0) - { - - std::string project_name = vKey[1]; - printf("Proj %s ",project_name.c_str()); - std::string project_value = key_value; - boost::to_lower(project_name); - std::string mainProject = ToOfficialName(project_name); - boost::to_lower(mainProject); - StructCPID structcpid = GetStructCPID(); - mvBoincProjects.insert(map::value_type(mainProject,structcpid)); - structcpid = mvBoincProjects[mainProject]; - structcpid.initialized = true; - structcpid.link = "http://"; - structcpid.projectname = mainProject; - mvBoincProjects[mainProject] = structcpid; - WHITELISTED_PROJECTS++; - - } - } - } - } - -} - - void Shutdown(void* parg) { static CCriticalSection cs_Shutdown; @@ -1024,8 +968,6 @@ bool AppInit2(ThreadHandlerPtr threads) LoadAdminMessages(true,sOut); printf("Done loading Admin messages"); - InitializeBoincProjects(); - printf("Done loading boinc projects"); uiInterface.InitMessage(_("Compute Neural Network Hashes...")); ComputeNeuralNetworkSupermajorityHashes(); diff --git a/src/main.cpp b/src/main.cpp index 7ee9317a71..e1f3628404 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,6 +22,7 @@ #include "beacon.h" #include "miner.h" #include "backup.h" +#include "appcache.h" #include #include @@ -277,7 +278,6 @@ bool bGridcoinGUILoaded = false; extern double LederstrumpfMagnitude2(double Magnitude, int64_t locktime); extern void WriteAppCache(std::string key, std::string value); -extern std::string AppCache(std::string key); extern void LoadCPIDsInBackground(); extern void ThreadCPIDs(); @@ -349,7 +349,6 @@ std::map mvNetworkCopy; //Contains the project sta std::map mvCreditNodeCPID; // Contains verified CPID Magnitudes; std::map mvCPIDCache; //Contains cached blocknumbers for CPID+Projects; std::map mvAppCache; //Contains cached blocknumbers for CPID+Projects; -std::map mvBoincProjects; // Contains all of the allowed boinc projects; std::map mvMagnitudes; // Contains Magnitudes by CPID & Outstanding Payments Owed per CPID std::map mvMagnitudesCopy; // Contains Magnitudes by CPID & Outstanding Payments Owed per CPID @@ -555,19 +554,19 @@ void GetGlobalStatus() -std::string AppCache(std::string key) -{ - - StructCPIDCache setting = mvAppCache["cache"+key]; - if (!setting.initialized) - { - setting.initialized=true; - setting.xml = ""; - mvAppCache.insert(map::value_type("cache"+key,setting)); - mvAppCache["cache"+key]=setting; - } - return setting.xml; -} +//std::string AppCache(std::string key) +//{ +// +// StructCPIDCache setting = mvAppCache["cache"+key]; +// if (!setting.initialized) +// { +// setting.initialized=true; +// setting.xml = ""; +// mvAppCache.insert(map::value_type("cache"+key,setting)); +// mvAppCache["cache"+key]=setting; +// } +// return setting.xml; +//} @@ -7330,15 +7329,24 @@ void InitializeProjectStruct(StructCPID& project) } - -bool ProjectIsValid(std::string project) +bool ProjectIsValid(std::string sProject) { - boost::to_lower(project); + if (sProject.empty()) + return false; - StructCPID structcpid = GetInitializedStructCPID2(project,mvBoincProjects); + boost::to_lower(sProject); - return structcpid.initialized; + for (const auto& item : AppCacheFilter("project")) + { + std::string sProjectKey = item.first; + std::vector vProjectKey = split(sProjectKey, ";"); + std::string sProjectName = ToOfficialName(vProjectKey[1]); + if (sProjectName == sProject) + return true; + } + + return false; } std::string ToOfficialName(std::string proj) @@ -8288,7 +8296,7 @@ bool MemorizeMessage(const CTransaction &tx, double dAmount, std::string sRecipi fMessageLoaded = true; } - WriteCache(sMessageType,sMessageKey+";TrxID",tx.GetHash().GetHex(),nTime); + //WriteCache(sMessageType,sMessageKey+";TrxID",tx.GetHash().GetHex(),nTime); } diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 8933b13d1d..3b11966f6d 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -21,6 +21,7 @@ #include // for to_lower() #include #include +#include using namespace json_spirit; using namespace std; @@ -150,6 +151,8 @@ std::string RetrieveMd5(std::string s1); std::string getfilecontents(std::string filename); +std::string ToOfficialName(std::string proj); + extern double GetNetworkAvgByProject(std::string projectname); void HarvestCPIDs(bool cleardata); void ExecuteCode(); @@ -4011,94 +4014,22 @@ Value listitem(const Array& params, bool fHelp) else if (sitem == "explainmagnitude") { + Object entry; if (msNeuralResponse.length() > 25) { - Object entry; std::vector vMag = split(msNeuralResponse.c_str(),""); for (unsigned int i = 0; i < vMag.size(); i++) { entry.push_back(Pair(RoundToString(i+1,0),vMag[i].c_str())); } - results.push_back(entry); } - else - { - - double mytotalrac = 0; - double nettotalrac = 0; - double projpct = 0; - double mytotalpct = 0; - double ParticipatingProjectCount = 0; - double TotalMagnitude = 0; - double Mag = 0; - Object entry; - std::string narr = ""; - std::string narr_desc = ""; - double TotalProjectRAC = 0; - double TotalUserVerifiedRAC = 0; - for(map::iterator ibp=mvBoincProjects.begin(); ibp!=mvBoincProjects.end(); ++ibp) + else { - StructCPID WhitelistedProject = mvBoincProjects[(*ibp).first]; - if (WhitelistedProject.initialized) - { - double ProjectRAC = GetNetworkTotalByProject(WhitelistedProject.projectname); - StructCPID structcpid = mvCPIDs[WhitelistedProject.projectname]; - bool including = false; - narr = ""; - narr_desc = ""; - double UserVerifiedRAC = 0; - if (structcpid.initialized) - { - if (structcpid.projectname.length() > 1) - { - including = (ProjectRAC > 0 && structcpid.Iscpidvalid && structcpid.rac > 1); - UserVerifiedRAC = structcpid.rac; - narr_desc = "NetRac: " + RoundToString(ProjectRAC,0) + ", CPIDValid: " - + YesNo(structcpid.Iscpidvalid) + ", RAC: " +RoundToString(structcpid.rac,0); - } - } - narr = including ? ("Participating " + narr_desc) : ("Enumerating " + narr_desc); - if (structcpid.projectname.length() > 1 && including) - { - entry.push_back(Pair(narr + " Project",structcpid.projectname)); - } - - projpct = UserVerifiedRAC/(ProjectRAC+.01); - nettotalrac += ProjectRAC; - mytotalrac = mytotalrac + UserVerifiedRAC; - mytotalpct = mytotalpct + projpct; - - double project_magnitude = - ((UserVerifiedRAC / (ProjectRAC + 0.01)) / (WHITELISTED_PROJECTS + 0.01)) * NeuralNetworkMultiplier; - - if (including) - { - TotalMagnitude += project_magnitude; - TotalUserVerifiedRAC += UserVerifiedRAC; - TotalProjectRAC += ProjectRAC; - ParticipatingProjectCount++; - - entry.push_back(Pair("User " + structcpid.projectname + " Verified RAC",UserVerifiedRAC)); - entry.push_back(Pair(structcpid.projectname + " Network RAC",ProjectRAC)); - entry.push_back(Pair("Your Project Magnitude",project_magnitude)); - } - - } - } - entry.push_back(Pair("Whitelisted Project Count", ToString(WHITELISTED_PROJECTS))); - entry.push_back(Pair("Grand-Total Verified RAC",mytotalrac)); - entry.push_back(Pair("Grand-Total Network RAC",nettotalrac)); - entry.push_back(Pair("Total Magnitude for All Projects",TotalMagnitude)); - entry.push_back(Pair("Grand-Total Whitelisted Projects",ToString(WHITELISTED_PROJECTS))); - entry.push_back(Pair("Participating Project Count",ParticipatingProjectCount)); - Mag = TotalMagnitude; - std::string babyNarr = "(" + RoundToString(TotalUserVerifiedRAC,2) + "/" + RoundToString(TotalProjectRAC,2) + ")/" + ToString(WHITELISTED_PROJECTS) + "*" + ToString(NeuralNetworkMultiplier) + "="; - entry.push_back(Pair(babyNarr,Mag)); - results.push_back(entry); - return results; + entry.push_back(Pair("ERROR", "No Neural Reponse; Try again later.")); } + results.push_back(entry); } else if (sitem == "superblocks") { @@ -4218,21 +4149,23 @@ Value listitem(const Array& params, bool fHelp) } else if (sitem == "projects") { - for(map::iterator ii=mvBoincProjects.begin(); ii!=mvBoincProjects.end(); ++ii) + for (const auto item : AppCacheFilter("project")) { + Object entry; - StructCPID structcpid = mvBoincProjects[(*ii).first]; + std::string sProjectKey = item.first; + std::vector vProjectKey = split(sProjectKey, ";"); + std::string sProjectName = ToOfficialName(vProjectKey[1]); + std::string sProjectURL = item.second; + sProjectURL.erase(std::remove(sProjectURL.begin(), sProjectURL.end(), '@'), sProjectURL.end()); - if (structcpid.initialized) - { - Object entry; - entry.push_back(Pair("Project",structcpid.projectname)); - entry.push_back(Pair("URL",structcpid.link)); - results.push_back(entry); + if (sProjectName.empty()) + continue; - } + entry.push_back(Pair("Project", sProjectName)); + entry.push_back(Pair("URL", sProjectURL)); + results.push_back(entry); } - return results; } else if (sitem == "leder") { From c79215e09c84f13947de35ad63a08804b791d161 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Sat, 21 Oct 2017 19:36:56 -0700 Subject: [PATCH 07/37] changes to list explainmagnitude --- src/main.cpp | 8 ++++---- src/rpcblockchain.cpp | 17 ++++++++++++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index e1f3628404..72d23a4b4e 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -1397,8 +1397,8 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CTransaction &tx, bool* pfMissingInput return error("AcceptToMemoryPool : CheckTransaction failed"); // Verify beacon contract in tx if found - if (!VerifyBeaconContractTx(tx.hashBoinc)) - return tx.DoS(25, error("AcceptToMemoryPool : bad beacon contract in tx; rejected")); + //if (!VerifyBeaconContractTx(tx.hashBoinc)) + // return tx.DoS(25, error("AcceptToMemoryPool : bad beacon contract in tx; rejected")); // Coinbase is only valid in a block, not as a loose transaction if (tx.IsCoinBase()) @@ -3975,8 +3975,8 @@ bool CBlock::CheckBlock(std::string sCaller, int height1, int64_t Mint, bool fCh return DoS(50, error("CheckBlock[] : block timestamp earlier than transaction timestamp")); // Verify beacon contract if a transaction contains a beacon contract - if (!VerifyBeaconContractTx(tx.hashBoinc) && !fLoadingIndex) - return DoS(25, error("CheckBlock[] : bad beacon contract found in tx contained within block; rejected")); + //if (!VerifyBeaconContractTx(tx.hashBoinc) && !fLoadingIndex) + // return DoS(25, error("CheckBlock[] : bad beacon contract found in tx contained within block; rejected")); } // Check for duplicate txids. This is caught by ConnectInputs(), diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 3b11966f6d..78d71017ee 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -4015,18 +4015,22 @@ Value listitem(const Array& params, bool fHelp) { Object entry; + if (msNeuralResponse.length() > 25) { + entry.push_back(Pair("Neural Response", "true")); + std::vector vMag = split(msNeuralResponse.c_str(),""); + for (unsigned int i = 0; i < vMag.size(); i++) - { entry.push_back(Pair(RoundToString(i+1,0),vMag[i].c_str())); - } } else { - entry.push_back(Pair("ERROR", "No Neural Reponse; Try again later.")); + entry.push_back(Pair("Neural Response", "false; Try again at a later time")); + + AsyncNeuralRequest("explainmag", GlobalCPUMiningCPID.cpid, 10); } results.push_back(entry); @@ -4162,6 +4166,13 @@ Value listitem(const Array& params, bool fHelp) if (sProjectName.empty()) continue; + // If contains an additional stats URL for project stats; remove it for the user to goto the correct website. + if (sProjectURL.find("stats/") != string::npos) + { + std::size_t tFound = sProjectURL.find("stats/"); + sProjectURL.erase(tFound, sProjectURL.length()); + } + entry.push_back(Pair("Project", sProjectName)); entry.push_back(Pair("URL", sProjectURL)); results.push_back(entry); From 1400a90b28115b64ee7776a60abea9b3aa112946 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Sat, 21 Oct 2017 19:39:09 -0700 Subject: [PATCH 08/37] reenable brods TrxID --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 72d23a4b4e..60bc325d34 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -8296,7 +8296,7 @@ bool MemorizeMessage(const CTransaction &tx, double dAmount, std::string sRecipi fMessageLoaded = true; } - //WriteCache(sMessageType,sMessageKey+";TrxID",tx.GetHash().GetHex(),nTime); + WriteCache(sMessageType,sMessageKey+";TrxID",tx.GetHash().GetHex(),nTime); } From 11a1e64b6a22271731cbfb3e1c914daae0504f09 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Sat, 21 Oct 2017 19:43:59 -0700 Subject: [PATCH 09/37] Remove rest of unused std::string AppCache function which conflicted with AppCache.cpp/h --- src/main.cpp | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 60bc325d34..535f6f5c51 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -552,24 +552,6 @@ void GetGlobalStatus() } } - - -//std::string AppCache(std::string key) -//{ -// -// StructCPIDCache setting = mvAppCache["cache"+key]; -// if (!setting.initialized) -// { -// setting.initialized=true; -// setting.xml = ""; -// mvAppCache.insert(map::value_type("cache"+key,setting)); -// mvAppCache["cache"+key]=setting; -// } -// return setting.xml; -//} - - - bool Timer_Main(std::string timer_name, int max_ms) { mvTimers[timer_name] = mvTimers[timer_name] + 1; From 35db222505b575224c0fd0002acd118693c1f135 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Sat, 21 Oct 2017 19:47:48 -0700 Subject: [PATCH 10/37] global_objects_noui.hpp change --- src/global_objects_noui.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/global_objects_noui.hpp b/src/global_objects_noui.hpp index 62d651f015..724c99b8c4 100755 --- a/src/global_objects_noui.hpp +++ b/src/global_objects_noui.hpp @@ -149,8 +149,6 @@ extern std::map mvAppCache; //Contains cached bloc //Global CPU Mining CPID: extern MiningCPID GlobalCPUMiningCPID; -//Boinc Valid Projects -extern std::map mvBoincProjects; // Contains all of the allowed boinc projects; // Timers extern std::map mvTimers; // Contains event timers that reset after max ms duration iterator is exceeded From 0ef4ac4883ffbd7354b5ed3af3b6768a3b3dc774 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Sat, 21 Oct 2017 20:34:43 -0700 Subject: [PATCH 11/37] renabled the VerifyBeaconContractTx i temp disabled as well as new pr fix was not yet in dev. --- src/main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 535f6f5c51..0b605c4616 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -1379,8 +1379,8 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CTransaction &tx, bool* pfMissingInput return error("AcceptToMemoryPool : CheckTransaction failed"); // Verify beacon contract in tx if found - //if (!VerifyBeaconContractTx(tx.hashBoinc)) - // return tx.DoS(25, error("AcceptToMemoryPool : bad beacon contract in tx; rejected")); + if (!VerifyBeaconContractTx(tx.hashBoinc)) + return tx.DoS(25, error("AcceptToMemoryPool : bad beacon contract in tx; rejected")); // Coinbase is only valid in a block, not as a loose transaction if (tx.IsCoinBase()) @@ -3957,8 +3957,8 @@ bool CBlock::CheckBlock(std::string sCaller, int height1, int64_t Mint, bool fCh return DoS(50, error("CheckBlock[] : block timestamp earlier than transaction timestamp")); // Verify beacon contract if a transaction contains a beacon contract - //if (!VerifyBeaconContractTx(tx.hashBoinc) && !fLoadingIndex) - // return DoS(25, error("CheckBlock[] : bad beacon contract found in tx contained within block; rejected")); + if (!VerifyBeaconContractTx(tx.hashBoinc) && !fLoadingIndex) + return DoS(25, error("CheckBlock[] : bad beacon contract found in tx contained within block; rejected")); } // Check for duplicate txids. This is caught by ConnectInputs(), From 596d10a37789b57e863b078b038ba9cbbbd0327b Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Sun, 22 Oct 2017 07:20:20 +0200 Subject: [PATCH 12/37] Remove "leder" RPC command. --- src/rpcblockchain.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index ab43d70bde..d03b2f4638 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -4232,19 +4232,6 @@ Value listitem(const Array& params, bool fHelp) } return results; } - else if (sitem == "leder") - { - double subsidy = LederstrumpfMagnitude2(450, GetAdjustedTime()); - Object entry; - entry.push_back(Pair("Mag Out For 450",subsidy)); - if (args.length() > 1) - { - double myrac=RoundFromString(args,0); - subsidy = LederstrumpfMagnitude2(myrac, GetAdjustedTime()); - entry.push_back(Pair("Mag Out",subsidy)); - } - results.push_back(entry); - } else if (sitem == "network") { for(map::iterator ii=mvNetwork.begin(); ii!=mvNetwork.end(); ++ii) From e4c917ebfe0fc1ff32434fae77d150f57fcdc793 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Sun, 22 Oct 2017 07:35:50 +0200 Subject: [PATCH 13/37] Remove "list staking" RPC command. --- src/rpcblockchain.cpp | 6 ---- src/rpcwallet.cpp | 64 ------------------------------------------- 2 files changed, 70 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index e49cb678ea..5057650534 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -60,7 +60,6 @@ double GetOutstandingAmountOwed(StructCPID &mag, std::string cpid, int64_t lockt bool ComputeNeuralNetworkSupermajorityHashes(); bool UpdateNeuralNetworkQuorumData(); extern Array LifetimeReport(std::string cpid); -Array StakingReport(); extern std::string AddContract(std::string sType, std::string sName, std::string sContract); StructCPID GetLifetimeCPID(const std::string& cpid, const std::string& sFrom); void WriteCache(std::string section, std::string key, std::string value, int64_t locktime); @@ -4081,11 +4080,6 @@ Value listitem(const Array& params, bool fHelp) results = LifetimeReport(cpid); return results; } - else if (sitem == "staking") - { - results = StakingReport(); - return results; - } else if (sitem == "currenttime") { diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp index 82c89f6fed..a3ac4cb709 100644 --- a/src/rpcwallet.cpp +++ b/src/rpcwallet.cpp @@ -23,8 +23,6 @@ extern void ThreadTopUpKeyPool(void* parg); double CoinToDouble(double surrogate); std::string ExtractXML(std::string XMLdata, std::string key, std::string key_end); -extern Array StakingReport(); - extern void ThreadCleanWalletPassphrase(void* parg); extern void TxToJSON(const CTransaction& tx, const uint256 hashBlock, json_spirit::Object& entry); @@ -1253,68 +1251,6 @@ static void MaybePushAddress(Object & entry, const CTxDestination &dest) } } - - -Array StakingReport() -{ - - Array results; - Object c; - std::string Narr = ToString(GetAdjustedTime()); - c.push_back(Pair("Staking Report",Narr)); - results.push_back(c); - Object entry; - int64_t nCoinStakeTotal = 0; - int64_t nNonCoinStakeTotal = 0; - int64_t nStake = 0; - int64_t nImmature = 0; - int64_t nDepthImmature = 0; - LOCK2(cs_main, pwalletMain->cs_wallet); - for (map::const_iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) - { - const CWalletTx* pcoin = &(*it).second; - int64_t amt = pwalletMain->GetCredit(*pcoin); - - if (pcoin->IsCoinStake()) - { - nCoinStakeTotal += amt; - if (pcoin->GetBlocksToMaturity() > 0 && pcoin->GetDepthInMainChain() > 0) - { - nStake += amt; - } - else - { - - if (pcoin->GetBlocksToMaturity() < 1) - { - nImmature+=amt; - } - else - { - if (pcoin->GetDepthInMainChain() < 1) nDepthImmature += amt; - } - } - - } - else - { - //Sent Tx - nNonCoinStakeTotal += amt; - - } - } - - entry.push_back(Pair("CoinStakeTotal", CoinToDouble(nCoinStakeTotal))); - entry.push_back(Pair("Non-CoinStakeTotal", CoinToDouble(nNonCoinStakeTotal))); - entry.push_back(Pair("Blocks Immature", CoinToDouble(nImmature))); - entry.push_back(Pair("Depth Immature", CoinToDouble(nDepthImmature))); - entry.push_back(Pair("Total Immature", CoinToDouble(nImmature+nDepthImmature))); - entry.push_back(Pair("Total Eligibile for Staking", CoinToDouble(nStake))); - results.push_back(entry); - return results; - -} - void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDepth, bool fLong, Array& ret, const isminefilter& filter=MINE_SPENDABLE) { int64_t nFee; From 69d67e955b014dbf7cbfd0631232c79d7ab02982 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Sun, 22 Oct 2017 07:38:00 +0200 Subject: [PATCH 14/37] Remove "list newbieage" RPC command. --- src/rpcblockchain.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 5057650534..446a03bd7a 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -4133,16 +4133,6 @@ Value listitem(const Array& params, bool fHelp) results = MagnitudeReport(msPrimaryCPID); return results; } - else if (sitem=="newbieage") - { - double dBeaconDt = BeaconTimeStamp(args,false); - Object entry; - entry.push_back(Pair("Sent",dBeaconDt)); - dBeaconDt = BeaconTimeStamp(args,true); - entry.push_back(Pair("Sent With ZeroOut Feature",dBeaconDt)); - results.push_back(entry); - return results; - } else if (sitem == "projects") { for (const auto item : AppCacheFilter("project")) From efafa3d61431766d9133240a941bbc0d94313fc2 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Sun, 22 Oct 2017 07:53:43 +0200 Subject: [PATCH 15/37] Remove "getsubsidy" PoW RPC command. --- src/bitcoinrpc.cpp | 1 - src/bitcoinrpc.h | 1 - src/rpcmining.cpp | 10 ---------- 3 files changed, 12 deletions(-) diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index dde1e81b56..369e6997f3 100644 --- a/src/bitcoinrpc.cpp +++ b/src/bitcoinrpc.cpp @@ -240,7 +240,6 @@ static const CRPCCommand vRPCCommands[] = { "getnettotals", &getnettotals, true, true }, { "getdifficulty", &getdifficulty, true, false }, { "getinfo", &getinfo, true, false }, - { "getsubsidy", &getsubsidy, true, false }, { "getmininginfo", &getmininginfo, true, false }, { "getstakinginfo", &getmininginfo, true, false }, { "getnewaddress", &getnewaddress, true, false }, diff --git a/src/bitcoinrpc.h b/src/bitcoinrpc.h index 2421b84264..532e8b8c94 100644 --- a/src/bitcoinrpc.h +++ b/src/bitcoinrpc.h @@ -151,7 +151,6 @@ extern json_spirit::Value importprivkey(const json_spirit::Array& params, bool f extern json_spirit::Value getaddednodeinfo(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value sendalert(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value addnode(const json_spirit::Array& params, bool fHelp); -extern json_spirit::Value getsubsidy(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value getmininginfo(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value getnettotals(const json_spirit::Array& params, bool fHelp); diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index d6ec303e7b..610d55860a 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -26,16 +26,6 @@ std::string GetNeuralNetworkSupermajorityHash(double& out_popularity); int64_t GetRSAWeightByCPID(std::string cpid); -Value getsubsidy(const Array& params, bool fHelp) -{ - if (fHelp || params.size() > 1) - throw runtime_error( - "getsubsidy [nTarget]\n" - "Returns proof-of-work subsidy value for the specified value of target."); - - return (uint64_t)GetProofOfWorkReward(0, GetAdjustedTime(),0); -} - Value getmininginfo(const Array& params, bool fHelp) { if (fHelp || params.size() != 0) From 9cab2f0c5f4116f043190c4596bd5654d7691040 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Sat, 21 Oct 2017 23:11:09 -0700 Subject: [PATCH 16/37] Transaction Description Overhaul (#696) Transaction Description Overhaul Cleaned up transactiondesc to make it more readable then it was originally. --- src/qt/transactiondesc.cpp | 194 ++++++++++--------- src/rpcrawtransaction.cpp | 384 +++++++++++++++++++++++++++++++------ 2 files changed, 431 insertions(+), 147 deletions(-) diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp index 91c25e5117..239c43c041 100644 --- a/src/qt/transactiondesc.cpp +++ b/src/qt/transactiondesc.cpp @@ -18,15 +18,15 @@ #include "json/json_spirit_writer_template.h" #include "json/json_spirit_utils.h" -void GetTxStakeBoincHashInfo(json_spirit::mObject& res, const CMerkleTx& mtx); -void GetTxNormalBoincHashInfo(json_spirit::mObject& res, const CMerkleTx& mtx); +std::vector> GetTxStakeBoincHashInfo(const CMerkleTx& mtx); +std::vector> GetTxNormalBoincHashInfo(const CMerkleTx& mtx); QString ToQString(std::string s) { - QString str1 = QString::fromUtf8(s.c_str()); - return str1; -} + QString str1 = QString::fromUtf8(s.c_str()); + return str1; +} QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx) { @@ -36,26 +36,29 @@ QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx) { if (wtx.nLockTime < LOCKTIME_THRESHOLD) return tr("Open for %n more block(s)", "", wtx.nLockTime - nBestHeight); + else return tr("Open until %1").arg(GUIUtil::dateTimeStr(wtx.nLockTime)); } + else { int nDepth = wtx.GetDepthInMainChain(); + if (nDepth < 0) return tr("conflicted"); + else if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0) return tr("%1/offline").arg(nDepth); + else if (nDepth < 10) return tr("%1/unconfirmed").arg(nDepth); + else return tr("%1 confirmations").arg(nDepth); } } - - - std::string PubKeyToGRCAddress(const CScript& scriptPubKey) { txnouttype type; @@ -67,25 +70,20 @@ std::string PubKeyToGRCAddress(const CScript& scriptPubKey) return ""; } - std::string grcaddress = ""; - for (auto const& addr : addresses) - { - grcaddress = CBitcoinAddress(addr).ToString(); - } - return grcaddress; -} - - + std::string grcaddress = ""; + for (auto const& addr : addresses) + grcaddress = CBitcoinAddress(addr).ToString(); + return grcaddress; +} QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) { - - QString strHTML; LOCK2(cs_main, wallet->cs_wallet); + strHTML.reserve(9250); strHTML += ""; @@ -93,36 +91,33 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) int64_t nCredit = wtx.GetCredit(); int64_t nDebit = wtx.GetDebit(); int64_t nNet = nCredit - nDebit; + int nRequests = wtx.GetRequestCount(); strHTML += "" + tr("Status") + ": " + FormatTxStatus(wtx); - int nRequests = wtx.GetRequestCount(); + if (nRequests != -1) { if (nRequests == 0) strHTML += tr(", has not been successfully broadcast yet"); + else if (nRequests > 0) strHTML += tr(", broadcast through %n node(s)", "", nRequests); } - strHTML += "
"; + strHTML += "
"; strHTML += "" + tr("Date") + ": " + (nTime ? GUIUtil::dateTimeStr(nTime) : "") + "
"; - // // From - // if (wtx.IsCoinBase()) - { strHTML += "" + tr("Source") + ": " + tr("Generated in CoinBase") + "
"; - } + else if (wtx.IsCoinStake()) - { strHTML += "" + tr("Source") + ": " + tr("Generated, PoS") + "
"; - } + + // Online transaction else if (wtx.mapValue.count("from") && !wtx.mapValue["from"].empty()) - { - // Online transaction strHTML += "" + tr("From") + ": " + GUIUtil::HtmlEscape(wtx.mapValue["from"]) + "
"; - } + else { // Offline transaction @@ -134,6 +129,7 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) if (wallet->IsMine(txout)) { CTxDestination address; + if (ExtractDestination(txout.scriptPubKey, address) && IsMine(*wallet, address)) { if (wallet->mapAddressBook.count(address)) @@ -141,73 +137,80 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) strHTML += "" + tr("From") + ": " + tr("unknown") + "
"; strHTML += "" + tr("To") + ": "; strHTML += GUIUtil::HtmlEscape(CBitcoinAddress(address).ToString()); + if (!wallet->mapAddressBook[address].empty()) strHTML += " (" + tr("own address") + ", " + tr("label") + ": " + GUIUtil::HtmlEscape(wallet->mapAddressBook[address]) + ")"; + else strHTML += " (" + tr("own address") + ")"; + strHTML += "
"; } } + break; } } } } - // // To - // if (wtx.mapValue.count("to") && !wtx.mapValue["to"].empty()) { // Online transaction std::string strAddress = wtx.mapValue["to"]; + strHTML += "" + tr("To") + ": "; + CTxDestination dest = CBitcoinAddress(strAddress).Get(); + if (wallet->mapAddressBook.count(dest) && !wallet->mapAddressBook[dest].empty()) strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[dest]) + " "; + strHTML += GUIUtil::HtmlEscape(strAddress) + "
"; } - // // Amount - // if (wtx.IsCoinBase() && nCredit == 0) { - // // Coinbase - // int64_t nUnmatured = 0; + for (auto const& txout : wtx.vout) nUnmatured += wallet->GetCredit(txout); + strHTML += "" + tr("Credit") + ": "; + if (wtx.IsInMainChain()) strHTML += BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nUnmatured)+ " (" + tr("matures in %n more block(s)", "", wtx.GetBlocksToMaturity()) + ")"; + else strHTML += "(" + tr("not accepted") + ")"; + strHTML += "
"; } + else if (nNet > 0) { - // // Credit - // strHTML += "" + tr("Credit") + ": " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nNet) + "
"; } + else { bool fAllFromMe = true; + for (auto const& txin : wtx.vin) fAllFromMe = fAllFromMe && wallet->IsMine(txin); bool fAllToMe = true; + for (auto const& txout : wtx.vout) fAllToMe = fAllToMe && wallet->IsMine(txout); if (fAllFromMe) { - // // Debit - // for (auto const& txout : wtx.vout) { if (wallet->IsMine(txout)) @@ -217,11 +220,14 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) { // Offline transaction CTxDestination address; + if (ExtractDestination(txout.scriptPubKey, address)) { strHTML += "" + tr("To") + ": "; + if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].empty()) strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[address]) + " "; + strHTML += GUIUtil::HtmlEscape(CBitcoinAddress(address).ToString()); strHTML += "
"; } @@ -235,23 +241,27 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) // Payment to self int64_t nChange = wtx.GetChange(); int64_t nValue = nCredit - nChange; + strHTML += "" + tr("Debit") + ": " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -nValue) + "
"; strHTML += "" + tr("Credit") + ": " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nValue) + "
"; } int64_t nTxFee = nDebit - wtx.GetValueOut(); + if (nTxFee > 0) strHTML += "" + tr("Transaction fee") + ": " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -nTxFee) + "
"; } + else { - // // Mixed debit transaction - // for (auto const& txin : wtx.vin) + if (wallet->IsMine(txin)) strHTML += "" + tr("Debit") + ": " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -wallet->GetDebit(txin)) + "
"; + for (auto const& txout : wtx.vout) + if (wallet->IsMine(txout)) strHTML += "" + tr("Credit") + ": " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, wallet->GetCredit(txout)) + "
"; } @@ -259,106 +269,118 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) strHTML += "" + tr("Net amount") + ": " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nNet, true) + "
"; - // // Message - // if (wtx.mapValue.count("message") && !wtx.mapValue["message"].empty()) strHTML += "
" + tr("Message") + ":
" + GUIUtil::HtmlEscape(wtx.mapValue["message"], true) + "
"; + if (wtx.mapValue.count("comment") && !wtx.mapValue["comment"].empty()) strHTML += "
" + tr("Comment") + ":
" + GUIUtil::HtmlEscape(wtx.mapValue["comment"], true) + "
"; - strHTML += "" + tr("Transaction ID") + ": " + wtx.GetHash().ToString().c_str() + "
"; + strHTML += "" + tr("TX ID") + ": " + wtx.GetHash().ToString().c_str() + "
"; + + std::string sHashBlock = wtx.hashBlock.ToString(); + + if (wtx.hashBlock == 0) + strHTML += "" + tr("Block Hash") + ": Not yet in chain
"; + + else + strHTML += "" + tr("Block Hash") + ": " + sHashBlock.c_str() + "
"; if (wtx.IsCoinBase() || wtx.IsCoinStake()) { + strHTML += "

" + tr("Transaction Stake Data") + "

"; + + std::vector> vTxStakeInfoIn = GetTxStakeBoincHashInfo(wtx); + + for (auto const& vTxStakeInfo : vTxStakeInfoIn) + { + strHTML += ""; + strHTML += MakeSafeMessage(vTxStakeInfo.first).c_str(); + strHTML += ": "; + strHTML += MakeSafeMessage(vTxStakeInfo.second).c_str(); + strHTML += "
"; + } - json_spirit::mObject out; - GetTxStakeBoincHashInfo(out, wtx); - strHTML += "
" + GUIUtil::HtmlEscape(json_spirit::write_string(json_spirit::mValue(out),true), true) + - "

" + tr("Gridcoin generated coins must mature 110 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to \"not accepted\" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.") + "
"; + strHTML == "

" + tr("Gridcoin generated coins must mature 110 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to \"not accepted\" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.") + "
"; } - else + + else if (!wtx.hashBoinc.empty()) { + strHTML += "

" + tr("Transaction Message Data") + "

"; - json_spirit::mObject out; - GetTxNormalBoincHashInfo(out, wtx); - strHTML += "
" + GUIUtil::HtmlEscape(json_spirit::write_string(json_spirit::mValue(out),true), true) + - "
"; + std::vector> vTxNormalInfoIn = GetTxNormalBoincHashInfo(wtx); + + for (auto const& vTxNormalInfo : vTxNormalInfoIn) + { + strHTML += ""; + strHTML += MakeSafeMessage(vTxNormalInfo.first).c_str(); + strHTML += ": "; + strHTML += MakeSafeMessage(vTxNormalInfo.second).c_str(); + strHTML += "
"; + } } - // // Debug view 12-7-2014 - Halford - // - // Smart Contracts msHashBoinc = ""; - if (fDebug || true) { - strHTML += "

" + tr("Information") + "

"; + strHTML += "

" + tr("Transaction Debits/Credits") + "

"; + for (auto const& txin : wtx.vin) + if(wallet->IsMine(txin)) strHTML += "" + tr("Debit") + ": " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, -wallet->GetDebit(txin)) + "
"; + for (auto const& txout : wtx.vout) + if(wallet->IsMine(txout)) strHTML += "" + tr("Credit") + ": " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, wallet->GetCredit(txout)) + "
"; - strHTML += "
" + tr("Transaction") + ":
"; + strHTML += "
" + tr("Transaction Data") + "

"; strHTML += GUIUtil::HtmlEscape(wtx.ToString(), true); CTxDB txdb("r"); // To fetch source txouts - //Decrypt any embedded messages - std::string eGRCMessage = ExtractXML(wtx.hashBoinc,"",""); - std::string sGRCMessage = MakeSafeMessage(eGRCMessage); - std::string sOptionsNarr = ExtractXML(wtx.hashBoinc,"",""); + // Contracts //std::string sContractLength = RoundToString((double)wtx.hashBoinc.length(),0); //std::string sContractInfo = ""; //if (wtx.hashBoinc.length() > 255) sContractInfo = ": " + wtx.hashBoinc.substr(0,255); - strHTML += "
Notes:
 " 
-            + QString::fromStdString(sGRCMessage) + "


"; - if (sOptionsNarr.length() > 1) - { - std::string oOptionsNarr = MakeSafeMessage(sOptionsNarr); - strHTML += "
Options:

 " + QString::fromStdString(oOptionsNarr) + "


"; - - } - if (fDebug3) - { + + //if (fDebug3) + //{ //Extract contract here from : wtx.hashBoinc - contract key //strHTML += "
Contracts: " + QString::fromStdString(sContractLength) + "


"; - } + //} + msHashBoinc += wtx.hashBoinc; - strHTML += "
" + tr("Inputs") + ":"; + strHTML += "
" + tr("Transaction Inputs") + ""; strHTML += "

    "; - for (auto const& txin : wtx.vin) { COutPoint prevout = txin.prevout; CTransaction prev; + if(txdb.ReadDiskTx(prevout.hash, prev)) { if (prevout.n < prev.vout.size()) { strHTML += "
  • "; - //Inputs: 7-31-2015 + + //Inputs: 7-31-2015 const CTxOut &vout = prev.vout[prevout.n]; - std::string grcFrom = PubKeyToGRCAddress(vout.scriptPubKey); - strHTML=strHTML + " " + QString::fromStdString(grcFrom) + " "; CTxDestination address; + if (ExtractDestination(vout.scriptPubKey, address)) - { - if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].empty()) - strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[address]) + " "; strHTML += QString::fromStdString(CBitcoinAddress(address).ToString()); - } - strHTML = strHTML + " " + tr("Amount") + "=" + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, vout.nValue); - strHTML = strHTML + " IsMine=" + (wallet->IsMine(vout) ? tr("true") : tr("false")) + "
  • "; + + strHTML += " " + tr("Amount") + "=" + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, vout.nValue); + strHTML += " IsMine=" + (wallet->IsMine(vout) ? tr("true") : tr("false")) + ""; } } } diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index a479d4d0bc..a451bf79b8 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -12,9 +12,8 @@ #include "main.h" #include "net.h" #include "wallet.h" -//#include "univalue.h" #include "upgrader.h" - +#include "ui_interface.h" using namespace std; using namespace boost; using namespace boost::assign; @@ -24,110 +23,373 @@ extern std::string GetTxProject(uint256 hash, int& out_blocknumber, int& out_blo extern void Imker(void *kippel); extern Upgrader upgrader; +extern std::vector> GetTxStakeBoincHashInfo(const CMerkleTx& mtx); +extern std::vector> GetTxNormalBoincHashInfo(const CMerkleTx& mtx); +std::string TimestampToHRDate(double dtm); +std::string GetPollXMLElementByPollTitle(std::string pollname, std::string XMLElement1, std::string XMLElement2); +std::string GetShareType(double dShareType); +bool PollCreatedAfterSecurityUpgrade(std::string pollname); +double DoubleFromAmount(int64_t amount); + #ifdef QT_GUI #include "qt/upgradedialog.h" extern Checker checker; #endif -void GetTxStakeBoincHashInfo(json_spirit::mObject& res, const CMerkleTx& mtx) +std::vector> GetTxStakeBoincHashInfo(const CMerkleTx& mtx) { assert(mtx.IsCoinStake() || mtx.IsCoinBase()); - - res["blockhash"]=mtx.hashBlock.GetHex(); + std::vector> res; // Fetch BlockIndex for tx block CBlockIndex* pindex = NULL; CBlock block; { map::iterator mi = mapBlockIndex.find(mtx.hashBlock); + if (mi == mapBlockIndex.end()) { - res["error"] = "block_not_in_index"; - return; + res.push_back(std::make_pair(_("ERROR"), _("Block not in index"))); + + return res; } + pindex = (*mi).second; + if (!block.ReadFromDisk(pindex)) { - res["error"] = "block_read_failed"; - return; + res.push_back(std::make_pair(_("ERROR"), _("Block read failed"))); + + return res; } } //Deserialize MiningCPID bb = DeserializeBoincBlock(block.vtx[0].hashBoinc,block.nVersion); - res["height"]=pindex->nHeight; - res["version"]=block.nVersion; + res.push_back(std::make_pair(_("Height"), ToString(pindex->nHeight))); + res.push_back(std::make_pair(_("Block Version"), ToString(block.nVersion))); + res.push_back(std::make_pair(_("Difficulty"), RoundToString(GetBlockDifficulty(block.nBits),8))); + res.push_back(std::make_pair(_("CPID"), bb.cpid)); + res.push_back(std::make_pair(_("Interest"), RoundToString(bb.InterestSubsidy,8))); - res["cpid"]=bb.cpid; - res["Magnitude"]=bb.Magnitude; - res["Interest"]=bb.InterestSubsidy; - res["BoincReward"]=bb.ResearchSubsidy; - res["Difficulty"]=GetBlockDifficulty(block.nBits); - - - if(fDebug) + if (bb.ResearchAverageMagnitude > 0) { - res["xbbBoincPublicKey"]=bb.BoincPublicKey; + res.push_back(std::make_pair(_("Boinc Reward"), RoundToString(bb.ResearchSubsidy,8))); + res.push_back(std::make_pair(_("Magnitude"), RoundToString(bb.Magnitude,8))); + res.push_back(std::make_pair(_("Average Magnitude"), RoundToString(bb.ResearchAverageMagnitude, 8))); + res.push_back(std::make_pair(_("Research Age"), RoundToString(bb.ResearchAge, 8))); + } - res["xbbOrganization"]=bb.Organization; - res["xbbClientVersion"]=bb.clientversion; + res.push_back(std::make_pair(_("Is Superblock"), (bb.superblock.length() >= 20 ? "Yes" : "No"))); - res["xbbNeuralHash"]=bb.NeuralHash; - res["xbbCurrentNeuralHash"]=bb.CurrentNeuralHash; - res["xbbNeuralContractSize"]=bb.superblock.length(); - } - else + if(fDebug) { - if(bb.superblock.length()>=20) - { - res["IsSuperBlock"]=true; - } + if (bb.superblock.length() >= 20) + res.push_back(std::make_pair(_("Neural Contract Binary Size"), ToString(bb.superblock.length()))); + + res.push_back(std::make_pair(_("Neural Hash"), bb.NeuralHash)); + res.push_back(std::make_pair(_("Current Neural Hash"), bb.CurrentNeuralHash)); + res.push_back(std::make_pair(_("Client Version"), bb.clientversion)); + res.push_back(std::make_pair(_("Organization"), bb.Organization)); + res.push_back(std::make_pair(_("Boinc Public Key"), bb.BoincPublicKey)); } + return res; } -void GetTxNormalBoincHashInfo(json_spirit::mObject& res, const CMerkleTx& mtx) +std::vector> GetTxNormalBoincHashInfo(const CMerkleTx& mtx) { assert(!mtx.IsCoinStake() && !mtx.IsCoinBase()); - res["blockhash"]=mtx.hashBlock.GetHex(); - const std::string &hashBoinc = mtx.hashBoinc; - const std::string &msg = mtx.hashBoinc; - - /* Possible formats: - * transaction - * a message - * cpid beacon - * vote - * poll - * unknown / text - */ + std::vector> res; + + try + { + const std::string &msg = mtx.hashBoinc; - res["bhLength"]=msg.length(); + res.push_back(std::make_pair(_("Network Date"), TimestampToHRDate((double)mtx.nTime))); - std::string sMessageType = ExtractXML(msg,"",""); - std::string sTrxMessage = ExtractXML(msg,"",""); + if (fDebug) + res.push_back(std::make_pair(_("Message Length"), ToString(msg.length()))); - if(sMessageType.length()) - { - res["bhType"]="message"; - res["msgType"]=sMessageType; - } - else if(sTrxMessage.length()) - { - res["bhType"]="TrxWithNote"; + std::string sMessageType = ExtractXML(msg, "", ""); + std::string sTxMessage = ExtractXML(msg, "", ""); + std::string sRainMessage = ExtractXML(msg, "", ""); + + if (sMessageType.length()) + { + if (sMessageType == "beacon") + { + std::string sBeaconAction = ExtractXML(msg, "", ""); + std::string sBeaconCPID = ExtractXML(msg, "", ""); + + if (sBeaconAction == "A") + { + res.push_back(std::make_pair(_("Message Type"), _("Add Beacon Contract"))); + + std::string sBeaconEncodedContract = ExtractXML(msg, "", ""); + + if (sBeaconEncodedContract.length() < 256) + { + // If for whatever reason the contract is not a proper one and the average length does exceed this size; Without this a seg fault will occur on the DecodeBase64 + // Another example is if an admin accidently uses add instead of delete in addkey to remove a beacon the 1 in 1 would cause a seg fault as well + res.push_back(std::make_pair(_("ERROR"), _("Contract length for beacon is less then 256 in length. Size: ") + ToString(sBeaconEncodedContract.length()))); + + if (fDebug) + res.push_back(std::make_pair(_("Message Data"), sBeaconEncodedContract)); + + return res; + } + + std::string sBeaconDecodedContract = DecodeBase64(sBeaconEncodedContract); + std::vector vBeaconContract = split(sBeaconDecodedContract.c_str(), ";"); + std::string sBeaconAddress = vBeaconContract[2]; + std::string sBeaconPublicKey = vBeaconContract[3]; + + res.push_back(std::make_pair(_("CPID"), sBeaconCPID)); + res.push_back(std::make_pair(_("Address"), sBeaconAddress)); + res.push_back(std::make_pair(_("Public Key"), sBeaconPublicKey)); + } + + else if (sBeaconAction == "D") + { + res.push_back(std::make_pair(_("Message Type"), _("Delete Beacon Contract"))); + res.push_back(std::make_pair(_("CPID"), sBeaconCPID)); + } + } + + else if (sMessageType == "poll") + { + std::string sPollType = ExtractXML(msg, "", ""); + std::string sPollTitle = ExtractXML(msg, "", ""); + std::replace(sPollTitle.begin(), sPollTitle.end(), '_', ' '); + std::string sPollDays = ExtractXML(msg, "", ""); + std::string sPollQuestion = ExtractXML(msg, "", ""); + std::string sPollAnswers = ExtractXML(msg, "", ""); + std::string sPollShareType = ExtractXML(msg, "", ""); + std::string sPollUrl = ExtractXML(msg, "", "", ""); + std::replace(sPollAnswers.begin(), sPollAnswers.end(), ';', ','); + sPollShareType = GetShareType(std::stod(sPollShareType)); + + if (Contains(sPollType, "[Foundation")) + res.push_back(std::make_pair(_("Message Type"), _("Add Foundation Poll"))); + + else + res.push_back(std::make_pair(_("Message Type"), _("Add Poll"))); + + res.push_back(std::make_pair(_("Title"), sPollTitle)); + res.push_back(std::make_pair(_("Question"), sPollQuestion)); + res.push_back(std::make_pair(_("Answers"), sPollAnswers)); + res.push_back(std::make_pair(_("Share Type"), sPollShareType)); + res.push_back(std::make_pair(_("URL"), sPollUrl)); + res.push_back(std::make_pair(_("Duration"), sPollDays + _(" days"))); + res.push_back(std::make_pair(_("Expires"), TimestampToHRDate(std::stod(sPollExpiration)))); + } + + else if (sMessageType == "vote") + { + std::string sVoteTitled = ExtractXML(msg, "", ""); + std::string sVoteShareType = GetPollXMLElementByPollTitle(sVoteTitled, "", ""); + std::string sVoteTitle = sVoteTitled; + std::replace(sVoteTitle.begin(), sVoteTitle.end(), '_', ' '); + std::string sVoteAnswer = ExtractXML(msg, "", ""); + std::replace(sVoteAnswer.begin(), sVoteAnswer.end(), ';', ','); + + res.push_back(std::make_pair(_("Message Type"), _("Vote"))); + res.push_back(std::make_pair(_("Title"), sVoteTitle)); + + if (sVoteShareType.empty()) + { + res.push_back(std::make_pair(_("Share Type"), _("Unable to extract Share Type. Vote likely > 6 months old"))); + res.push_back(std::make_pair(_("Answer"), sVoteAnswer)); + + if (fDebug) + res.push_back(std::make_pair(_("Share Type Debug"), sVoteShareType)); + + return res; + } + + else + res.push_back(std::make_pair(_("Share Type"), GetShareType(std::stod(sVoteShareType)))); + + res.push_back(std::make_pair(_("Answer"), sVoteAnswer)); + + // Basic Variables for all poll types + double dVoteWeight = 0; + double dVoteMagnitude = 0; + double dVoteBalance = 0; + std::string sVoteMagnitude; + std::string sVoteBalance; + + // Get voting magnitude and balance; These fields are always in vote contract + if (!PollCreatedAfterSecurityUpgrade(sVoteTitled)) + { + sVoteMagnitude = ExtractXML(msg, "", ""); + sVoteBalance = ExtractXML(msg, "", ""); + } + + else + { + sVoteMagnitude = ExtractXML(msg, "", ""); + sVoteBalance = ExtractXML(msg, "", ""); + } + + if (sVoteShareType == "1") + dVoteWeight = std::stod(sVoteMagnitude); + + else if (sVoteShareType == "2") + dVoteWeight = std::stod(sVoteBalance); + + else if (sVoteShareType == "3") + { + // For voting mag for mag + balance polls we need to calculate total network magnitude from superblock before vote to use the correct data in formula. + // This gives us an accruate vote shares at that time. We like to keep wallet information as accruate as possible. + // Note during boosted superblocks we get unusual calculations for total network magnitude. + CBlockIndex* pblockindex = mapBlockIndex[mtx.hashBlock]; + CBlock block; + + int nEndHeight = pblockindex->nHeight - (BLOCKS_PER_DAY*14); + + // Incase; Why throw. + if (nEndHeight < 1) + nEndHeight = 1; + + // Iterate back to find previous superblock + while (pblockindex->nHeight > nEndHeight && pblockindex->nIsSuperBlock == 0) + pblockindex = pblockindex->pprev; + + if (pblockindex->nIsSuperBlock == 1) + { + block.ReadFromDisk(pblockindex); + + std::string sHashBoinc = block.vtx[0].hashBoinc; + + MiningCPID vbb = DeserializeBoincBlock(sHashBoinc, block.nVersion); + + std::string sUnpackedSuperblock = UnpackBinarySuperblock(vbb.superblock); + std::string sMagnitudeContract = ExtractXML(sUnpackedSuperblock, "", ""); + + // Since Superblockavg function gives avg for mags yes but total cpids we cannot use this function + // We need the rows_above_zero for Total Network Magnitude calculation with Money Supply Factor. + std::vector vMagnitudeContract = split(sMagnitudeContract, ";"); + int nRowsWithMag = 0; + double dTotalMag = 0; + + for (auto const& sMag : vMagnitudeContract) + { + const std::vector& vFields = split(sMag, ","); + + if (vFields.size() < 2) + continue; + + const std::string& sCPID = vFields[0]; + double dMAG = std::stoi(vFields[1].c_str()); + + if (sCPID.length() > 10) + { + nRowsWithMag++; + dTotalMag += dMAG; + } + } + + double dOutAverage = dTotalMag / ((double)nRowsWithMag + .01); + double dTotalNetworkMagnitude = (double)nRowsWithMag * dOutAverage; + double dMoneySupply = DoubleFromAmount(pblockindex->nMoneySupply); + double dMoneySupplyFactor = (dMoneySupply/dTotalNetworkMagnitude + .01); + + dVoteMagnitude = cdbl(sVoteMagnitude,2); + dVoteBalance = cdbl(sVoteBalance,2); + + if (dVoteMagnitude > 0) + dVoteWeight = ((dMoneySupplyFactor/5.67) * dVoteMagnitude) + std::stod(sVoteBalance); + + else + dVoteWeight = std::stod(sVoteBalance); + + res.push_back(std::make_pair(_("Magnitude"), RoundToString(dVoteMagnitude, 2))); + res.push_back(std::make_pair(_("Balance"), RoundToString(dVoteBalance, 2))); + } + + else + { + res.push_back(std::make_pair(_("ERROR"), _("Unable to obtain superblock data before vote was made to calculate voting weight"))); + + return res; + } + } + + else if (sVoteShareType == "4" || sVoteShareType == "5") + dVoteWeight = 1; + + res.push_back(std::make_pair(_("Weight"), RoundToString(dVoteWeight, 0))); + } + + else if (sMessageType == "project") + { + std::string sProjectName = ExtractXML(msg, "", ""); + std::string sProjectURL = ExtractXML(msg, "", ""); + std::string sProjectAction = ExtractXML(msg, "", ""); + + if (sProjectAction == "A") + res.push_back(std::make_pair(_("Messate Type"), _("Add Project"))); + + else if (sProjectAction == "D") + res.push_back(std::make_pair(_("Message Type"), _("Delete Project"))); + + res.push_back(std::make_pair(_("Name"), sProjectName)); + + if (sProjectAction == "A") + res.push_back(std::make_pair(_("URL"), sProjectURL)); + } + + else + { + res.push_back(std::make_pair(_("Message Type"), _("Unknown"))); + + if (fDebug) + res.push_back(std::make_pair(_("Data"), msg)); + + return res; + } + } + + else if (sTxMessage.length()) + { + res.push_back(std::make_pair(_("Message Type"), _("Text Message"))); + res.push_back(std::make_pair(_("Message"), sTxMessage)); + } + + else if (sRainMessage.length()) + { + res.push_back(std::make_pair(_("Message Type"), _("Text Rain Message"))); + res.push_back(std::make_pair(_("Message"), sRainMessage)); + } + + else if (sMessageType.empty() && sTxMessage.empty() && sRainMessage.empty()) + res.push_back(std::make_pair(_("Message Type"), _("No Attached Messages"))); + + return res; } - else if(msg.length()) + + catch (const std::invalid_argument& e) { - res["bhType"]="Unknown"; + std::string sE(e.what()); + + res.push_back(std::make_pair(_("ERROR"), _("Invalid argument exception while parsing Transaction Message -> ") + sE)); + + return res; } - else + + catch (const std::out_of_range& e) { - res["bhType"]="None"; - } + std::string sE(e.what()); -} + res.push_back(std::make_pair(_("ERROR"), _("Out of rance exception while parsing Transaction Message -> ") + sE)); + return res; + } +} Value downloadblocks(const Array& params, bool fHelp) { From 74ea3423d332f70949c0daff733b18be46a29bfd Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Sun, 22 Oct 2017 13:32:46 +0200 Subject: [PATCH 17/37] Fix build error. --- src/rpcrawtransaction.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index a451bf79b8..fd3e089895 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -298,8 +298,8 @@ std::vector> GetTxNormalBoincHashInfo(const double dMoneySupply = DoubleFromAmount(pblockindex->nMoneySupply); double dMoneySupplyFactor = (dMoneySupply/dTotalNetworkMagnitude + .01); - dVoteMagnitude = cdbl(sVoteMagnitude,2); - dVoteBalance = cdbl(sVoteBalance,2); + dVoteMagnitude = RoundFromString(sVoteMagnitude,2); + dVoteBalance = RoundFromString(sVoteBalance,2); if (dVoteMagnitude > 0) dVoteWeight = ((dMoneySupplyFactor/5.67) * dVoteMagnitude) + std::stod(sVoteBalance); From 9e34ea5dc14a34bd8c2cdeb2ff8bce90d75368ec Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Sun, 22 Oct 2017 14:24:03 -0700 Subject: [PATCH 18/37] const auto& as requested for mvBoincProjects --- src/rpcblockchain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 446a03bd7a..2ede196a89 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -4135,7 +4135,7 @@ Value listitem(const Array& params, bool fHelp) } else if (sitem == "projects") { - for (const auto item : AppCacheFilter("project")) + for (const auto& item : AppCacheFilter("project")) { Object entry; From 01c24c801281d6a315341c7be8607680652b9034 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Sun, 22 Oct 2017 15:30:53 -0700 Subject: [PATCH 19/37] remove explainmagnitude2 and add force option to explainmagnitude as these functions currently do the same now --- src/rpcblockchain.cpp | 64 ++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 37 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 2ede196a89..744bb2db94 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -2045,35 +2045,6 @@ Value execute(const Array& params, bool fHelp) entry.push_back(Pair("Requested a quorum - waiting for resolution.",1)); results.push_back(entry); } - else if (sItem == "explainmagnitude2") - { - bool force = false; - if (params.size() == 2) - { - std::string optional = params[1].get_str(); - boost::to_lower(optional); - if (optional == "force") force = true; - } - - if (force) msNeuralResponse = ""; - if (msNeuralResponse=="") - { - AsyncNeuralRequest("explainmag",GlobalCPUMiningCPID.cpid,10); - entry.push_back(Pair("Requested Explain Magnitude For",GlobalCPUMiningCPID.cpid)); - } - - std::vector vMag = split(msNeuralResponse.c_str(),""); - for (unsigned int i = 0; i < vMag.size(); i++) - { - entry.push_back(Pair(RoundToString(i+1,0),vMag[i].c_str())); - } - if (msNeuralResponse=="") - { - entry.push_back(Pair("Response","No response.")); - } - - results.push_back(entry); - } else if (sItem == "tally") { bNetAveragesLoaded = false; @@ -2507,7 +2478,6 @@ Value execute(const Array& params, bool fHelp) entry.push_back(Pair("execute dportally", "Tally magnitudes in superblock")); entry.push_back(Pair("execute encrypt ", "Encrypt a wallet pass phrase (autounlock feature)")); entry.push_back(Pair("execute encryptphrase ", "Encrypt a phrase or message")); - entry.push_back(Pair("execute explainmagnitude2 ", "Explains your neural network magnitude. True is optional for force")); entry.push_back(Pair("execute listallpolldetails", "Displays all polls past and present with details")); entry.push_back(Pair("execute listallpolls", "Displays all polls past and present")); entry.push_back(Pair("execute listpolldetails", "Displays all active polls details")); @@ -4009,10 +3979,34 @@ Value listitem(const Array& params, bool fHelp) results.push_back(entry); } else if (sitem == "explainmagnitude") - { - + { Object entry; + bool bForce = false; + + if (params.size() == 2) + { + std::string sOptional = params[1].get_str(); + + boost::to_lower(sOptional); + + if (sOptional == "force") + bForce = true; + } + + if (bForce) + { + if (msNeuralResponse.length() < 25) + { + entry.push_back(Pair("Neural Response", "Empty; Requesting a response..")); + entry.push_back(Pair("WARNING", "Only force once and try again without force if response is not received. Doing too many force attempts gets a temporary ban from neural node responses")); + + msNeuralResponse = ""; + + AsyncNeuralRequest("explainmag", GlobalCPUMiningCPID.cpid, 10); + } + } + if (msNeuralResponse.length() > 25) { entry.push_back(Pair("Neural Response", "true")); @@ -4024,12 +4018,8 @@ Value listitem(const Array& params, bool fHelp) } else - { entry.push_back(Pair("Neural Response", "false; Try again at a later time")); - AsyncNeuralRequest("explainmag", GlobalCPUMiningCPID.cpid, 10); - } - results.push_back(entry); } else if (sitem == "superblocks") @@ -4279,7 +4269,7 @@ Value listitem(const Array& params, bool fHelp) entry.push_back(Pair("list currenttime", "Displays current unix time as well as UTC time and date")); entry.push_back(Pair("list detailmagnitudecsv", "Records more detailed magnitude report into a csv file")); entry.push_back(Pair("list debugexplainmagnitude", "Displays more in detail your explainmagnitude from NN")); - entry.push_back(Pair("list explainmagnitude", "Displays information about your magnitude from NN")); + entry.push_back(Pair("list explainmagnitude ", "Displays information about your magnitude from NN; Optional force")); entry.push_back(Pair("list lifetime", "Displays information on the life time of your cpid")); entry.push_back(Pair("list magnitude ", "Displays information on magnitude. cpid is optional.")); entry.push_back(Pair("list magnitudecsv", "Records magnitude report into a csv file")); From 2e36b68787a9fe72b4f8b68e70f6364d195958d6 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Sun, 22 Oct 2017 15:33:56 -0700 Subject: [PATCH 20/37] change to make force a true entry --- src/rpcblockchain.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 744bb2db94..d73178376d 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -3990,7 +3990,7 @@ Value listitem(const Array& params, bool fHelp) boost::to_lower(sOptional); - if (sOptional == "force") + if (sOptional == "true") bForce = true; } @@ -4269,7 +4269,7 @@ Value listitem(const Array& params, bool fHelp) entry.push_back(Pair("list currenttime", "Displays current unix time as well as UTC time and date")); entry.push_back(Pair("list detailmagnitudecsv", "Records more detailed magnitude report into a csv file")); entry.push_back(Pair("list debugexplainmagnitude", "Displays more in detail your explainmagnitude from NN")); - entry.push_back(Pair("list explainmagnitude ", "Displays information about your magnitude from NN; Optional force")); + entry.push_back(Pair("list explainmagnitude ", "Displays information about your magnitude from NN; Optional true to force response")); entry.push_back(Pair("list lifetime", "Displays information on the life time of your cpid")); entry.push_back(Pair("list magnitude ", "Displays information on magnitude. cpid is optional.")); entry.push_back(Pair("list magnitudecsv", "Records magnitude report into a csv file")); From b9fa6511f99892f9a370ec01c98c31c096c9f25c Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Mon, 23 Oct 2017 10:06:39 +0200 Subject: [PATCH 21/37] Remove unused ExtractHTML. --- src/main.cpp | 34 ---------------------------------- src/rpcblockchain.cpp | 1 - 2 files changed, 35 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 5ca75c19f0..7c1206066b 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -143,7 +143,6 @@ set setpwalletRegistered; CCriticalSection cs_main; extern std::string NodeAddress(CNode* pfrom); -extern std::string ExtractHTML(std::string HTMLdata, std::string tagstartprefix, std::string tagstart_suffix, std::string tag_end); CTxMemPool mempool; unsigned int nTransactionsUpdated = 0; @@ -4906,39 +4905,6 @@ std::string ExtractXML(std::string XMLdata, std::string key, std::string key_end return extraction; } -std::string ExtractHTML(std::string HTMLdata, std::string tagstartprefix, std::string tagstart_suffix, std::string tag_end) -{ - - std::string extraction = ""; - string::size_type loc = HTMLdata.find( tagstartprefix, 0 ); - if( loc != string::npos ) - { - //Find the end of the start tag - string::size_type loc_EOStartTag = HTMLdata.find( tagstart_suffix, loc+tagstartprefix.length()); - if (loc_EOStartTag != string::npos ) - { - - string::size_type loc_end = HTMLdata.find( tag_end, loc_EOStartTag+tagstart_suffix.length()); - if (loc_end != string::npos ) - { - extraction = HTMLdata.substr(loc_EOStartTag+(tagstart_suffix.length()), loc_end-loc_EOStartTag-(tagstart_suffix.length())); - extraction = strReplace(extraction,",",""); - if (Contains(extraction,"\r\n")) - { - std::vector vExtract = split(extraction,"\r\n"); - if (vExtract.size() >= 2) - { - extraction = vExtract[2]; - return extraction; - } - } - } - } - } - return extraction; -} - - std::string RetrieveMd5(std::string s1) { try diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index d73178376d..069a584384 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -69,7 +69,6 @@ bool LoadAdminMessages(bool bFullTableScan,std::string& out_errors); int64_t GetMaximumBoincSubsidy(int64_t nTime); double GRCMagnitudeUnit(int64_t locktime); std::string ExtractXML(std::string XMLdata, std::string key, std::string key_end); -std::string ExtractHTML(std::string HTMLdata, std::string tagstartprefix, std::string tagstart_suffix, std::string tag_end); std::string NeuralRequest(std::string MyNeuralRequest); extern bool AdvertiseBeacon(std::string &sOutPrivKey, std::string &sOutPubKey, std::string &sError, std::string &sMessage); From ce8061ede43f9ae697e13ae945ced10ea574dd16 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Mon, 23 Oct 2017 10:14:28 +0200 Subject: [PATCH 22/37] Remove unnecessary forward declarations. --- src/main.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 7c1206066b..03ef37c8fa 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -168,17 +168,12 @@ std::string DefaultOrgKey(int key_length); double MintLimiter(double PORDiff,int64_t RSA_WEIGHT,std::string cpid,int64_t locktime); double GetLastPaymentTimeByCPID(std::string cpid); -extern bool Contains(const std::string& data, const std::string& instring); - extern double CoinToDouble(double surrogate); extern int64_t PreviousBlockAge(); void CheckForUpgrade(); int64_t GetRSAWeightByCPID(std::string cpid); extern MiningCPID GetMiningCPID(); extern StructCPID GetStructCPID(); - -extern void SetAdvisory(); -extern bool InAdvisory(); json_spirit::Array MagnitudeReportCSV(bool detail); int64_t nLastBlockSolved = 0; //Future timestamp From f5d3835bc89022bfeadd9d3bc00cdcb071eca204 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Mon, 23 Oct 2017 10:40:31 +0200 Subject: [PATCH 23/37] Remove automatic block downloading from service function. If the user wants to download the chain it can be done with a manual trigger. The automatic trigger was super restrictive anyway. --- src/main.cpp | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 03ef37c8fa..ba721fa850 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -54,7 +54,6 @@ extern void ResetTimerMain(std::string timer_name); extern bool TallyResearchAverages(bool Forcefully); extern void IncrementCurrentNeuralNetworkSupermajority(std::string NeuralHash, std::string GRCAddress, double distance); bool VerifyCPIDSignature(std::string sCPID, std::string sBlockHash, std::string sSignature); -int DownloadBlocks(); int DetermineCPIDType(std::string cpid); extern MiningCPID GetInitializedMiningCPID(std::string name, std::map& vRef); std::string GetListOfWithConsensus(std::string datatype); @@ -300,7 +299,6 @@ std::string msPrimaryCPID; double mdPORNonce = 0; double mdLastPorNonce = 0; double mdMachineTimerLast = 0; -bool mbBlocksDownloaded = false; // Mining status variables std::string msHashBoinc; std::string msMiningErrors; @@ -4232,22 +4230,7 @@ void GridcoinServices() } #endif // Services thread activity - - //This is Gridcoins Service thread; called once per block - if (nBestHeight > 100 && nBestHeight < 200) - { - if (GetArg("-suppressdownloadblocks", "true") == "false") - { - std::string email = GetArgument("email", "NA"); - if (email.length() > 5 && !mbBlocksDownloaded) - { - #if defined(WIN32) && defined(QT_GUI) - mbBlocksDownloaded=true; - DownloadBlocks(); - #endif - } - } - } + //Dont perform the following functions if out of sync if (pindexBest->nHeight < nGrandfather) return; From 09f45ee4a20f965b2a7214412616388a6a51007a Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Fri, 29 Sep 2017 05:24:00 +0200 Subject: [PATCH 24/37] Extract PoR checks from CheckBlock and call it in AcceptBlock instead. --- src/main.cpp | 200 +++++++++++++++++++++++++++++---------------------- src/main.h | 5 ++ 2 files changed, 118 insertions(+), 87 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index ba721fa850..c155876b0e 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -2147,6 +2147,63 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits) return true; } +bool CheckProofOfResearch( + const CBlockIndex* pindexPrev, //previous block in chain index + const CBlock &block) //block to check +{ + if(block.vtx.size() == 0 || + !block.IsProofOfStake() || + pindexPrev->nHeight <= nGrandfather || + !IsResearchAgeEnabled(pindexPrev->nHeight)) + return true; + + MiningCPID bb = DeserializeBoincBlock(block.vtx[0].hashBoinc, block.nVersion); + if(!IsResearcher(bb.cpid)) + return true; + + //For higher security, plus lets catch these bad blocks before adding them to the chain to prevent reorgs: + double OUT_POR = 0; + double OUT_INTEREST = 0; + double dAccrualAge = 0; + double dMagnitudeUnit = 0; + double dAvgMagnitude = 0; + int64_t nCoinAge = 0; + int64_t nFees = 0; + + // 6-4-2017 - Verify researchers stored block magnitude + double dNeuralNetworkMagnitude = CalculatedMagnitude2(bb.cpid, block.nTime, false); + if (bb.Magnitude > 0 && + bb.Magnitude > (dNeuralNetworkMagnitude*1.25) && + (fTestNet || (!fTestNet && pindexPrev->nHeight > 947000))) + { + return error("CheckProofOfResearch: Researchers block magnitude > neural network magnitude: Block Magnitude %f, Neural Network Magnitude %f, CPID %s ", + bb.Magnitude, dNeuralNetworkMagnitude, bb.cpid.c_str()); + } + + int64_t nCalculatedResearch = GetProofOfStakeReward(nCoinAge, nFees, bb.cpid, true, 1, block.nTime, + pindexBest, "checkblock_researcher", OUT_POR, OUT_INTEREST, dAccrualAge, dMagnitudeUnit, dAvgMagnitude); + + // TODO: Remove this tally? + if (bb.ResearchSubsidy > ((OUT_POR*1.25)+1)) + { + BusyWaitForTally(); + StructCPID st1 = GetLifetimeCPID(bb.cpid,"CheckProofOfResearch()"); + nCalculatedResearch = GetProofOfStakeReward(nCoinAge, nFees, bb.cpid, true, 2, block.nTime, + pindexBest, "checkblock_researcher_doublecheck", OUT_POR, OUT_INTEREST, dAccrualAge, dMagnitudeUnit, dAvgMagnitude); + + if (bb.ResearchSubsidy > ((OUT_POR*1.25)+1)) + { + if (fDebug3) printf("CheckProofOfResearch: Researchers Reward Pays too much : Interest %f and Research %f and StakeReward %f, OUT_POR %f, with Out_Interest %f for CPID %s ", + bb.InterestSubsidy, bb.ResearchSubsidy, CoinToDouble(nCalculatedResearch), OUT_POR, OUT_INTEREST, bb.cpid.c_str()); + + return block.DoS(10,error("CheckProofOfResearch: Researchers Reward Pays too much : Interest %f and Research %f and StakeReward %f, OUT_POR %f, with Out_Interest %f for CPID %s ", + bb.InterestSubsidy, bb.ResearchSubsidy,CoinToDouble(nCalculatedResearch), OUT_POR, OUT_INTEREST, bb.cpid.c_str())); + } + } + + return true; +} + // Return maximum amount of blocks that other nodes claim to have int GetNumBlocksOfPeers() { @@ -3818,104 +3875,68 @@ bool CBlock::CheckBlock(std::string sCaller, int height1, int64_t Mint, bool fCh if (bb.cpid != "INVESTOR" && IsProofOfStake() && height1 > nGrandfather && IsResearchAgeEnabled(height1) && BlockNeedsChecked(nTime) && !fLoadingIndex) { - // 6-4-2017 - Verify researchers stored block magnitude - double dNeuralNetworkMagnitude = CalculatedMagnitude2(bb.cpid, nTime, false); - if (bb.Magnitude > 0 && bb.Magnitude > (dNeuralNetworkMagnitude*1.25) && (fTestNet || (!fTestNet && height1 > 947000))) - { - return error("CheckBlock[ResearchAge] : Researchers block magnitude > neural network magnitude: Block Magnitude %f, Neural Network Magnitude %f, CPID %s ", - (double)bb.Magnitude,(double)dNeuralNetworkMagnitude,bb.cpid.c_str()); - } - int64_t nCalculatedResearch = GetProofOfStakeReward(nCoinAge, nFees, bb.cpid, true, 1, nTime, - pindexBest, sCaller + "_checkblock_researcher", OUT_POR, OUT_INTEREST, dAccrualAge, dMagnitudeUnit, dAvgMagnitude); - - - if (bb.ResearchSubsidy > ((OUT_POR*1.25)+1)) - { - BusyWaitForTally(); - StructCPID st1 = GetLifetimeCPID(bb.cpid,"CheckBlock()"); - nCalculatedResearch = GetProofOfStakeReward(nCoinAge, nFees, bb.cpid, true, 2, nTime, - pindexBest, sCaller + "_checkblock_researcher_doublecheck", OUT_POR, OUT_INTEREST, dAccrualAge, dMagnitudeUnit, dAvgMagnitude); - - if (bb.ResearchSubsidy > ((OUT_POR*1.25)+1)) - { - - if (fDebug3) printf("CheckBlock[ResearchAge] : Researchers Reward Pays too much : Interest %f and Research %f and StakeReward %f, OUT_POR %f, with Out_Interest %f for CPID %s ", - (double)bb.InterestSubsidy,(double)bb.ResearchSubsidy,CoinToDouble(nCalculatedResearch),(double)OUT_POR,(double)OUT_INTEREST,bb.cpid.c_str()); - - return DoS(10,error("CheckBlock[ResearchAge] : Researchers Reward Pays too much : Interest %f and Research %f and StakeReward %f, OUT_POR %f, with Out_Interest %f for CPID %s ", - (double)bb.InterestSubsidy,(double)bb.ResearchSubsidy,CoinToDouble(nCalculatedResearch),(double)OUT_POR,(double)OUT_INTEREST,bb.cpid.c_str())); - // Reserved for future use. - } - } + double blockVersion = BlockVersion(bb.clientversion); + double cvn = ClientVersionNew(); + if (fDebug10) printf("BV %f, CV %f ",blockVersion,cvn); + // Enforce Beacon Age + if (blockVersion < 3588 && height1 > 860500 && !fTestNet) + return error("CheckBlock[]: Old client spamming new blocks after mandatory upgrade \r\n"); + } + //Orphan Flood Attack + if (height1 > nGrandfather) + { + double bv = BlockVersion(bb.clientversion); + double cvn = ClientVersionNew(); + if (fDebug10) printf("BV %f, CV %f ",bv,cvn); + // Enforce Beacon Age + if (bv < 3588 && height1 > 860500 && !fTestNet) + return error("CheckBlock[]: Old client spamming new blocks after mandatory upgrade \r\n"); } - - //ProofOfResearch - if (vtx.size() > 0) + if (bb.cpid != "INVESTOR" && height1 > nGrandfather && BlockNeedsChecked(nTime)) { - //Orphan Flood Attack - if (height1 > nGrandfather) - { - double bv = BlockVersion(bb.clientversion); - double cvn = ClientVersionNew(); - if (fDebug10) printf("BV %f, CV %f ",bv,cvn); - // if (bv+10 < cvn) return error("ConnectBlock[]: Old client version after mandatory upgrade - block rejected\r\n"); - // Enforce Beacon Age - if (bv < 3588 && height1 > 860500 && !fTestNet) return error("CheckBlock[]: Old client spamming new blocks after mandatory upgrade \r\n"); - //if (bv < 3580 && fTestNet) return DoS(25, error("CheckBlock[]: Old testnet client spamming new blocks after mandatory upgrade \r\n")); - } + if (bb.projectname.empty() && !IsResearchAgeEnabled(height1)) + return DoS(1,error("CheckBlock::PoR Project Name invalid")); - if (bb.cpid != "INVESTOR" && height1 > nGrandfather && BlockNeedsChecked(nTime)) - { - if (bb.projectname.empty() && !IsResearchAgeEnabled(height1)) return DoS(1,error("CheckBlock::PoR Project Name invalid")); - if (!fLoadingIndex && !IsCPIDValidv2(bb,height1)) - { - std::string sOut2 = ""; - LoadAdminMessages(false,sOut2); - if (!fLoadingIndex && !IsCPIDValidv2(bb,height1)) - { - return error("Bad CPID or Block Signature : height %f, CPID %s, cpidv2 %s, LBH %s, Bad Hashboinc %s",(double)height1, - bb.cpid.c_str(), bb.cpidv2.c_str(), - bb.lastblockhash.c_str(), vtx[0].hashBoinc.c_str()); - } - } - - } - - // Gridcoin: check proof-of-stake block signature - if (IsProofOfStake() && height1 > nGrandfather) + if (!fLoadingIndex && !IsCPIDValidv2(bb,height1)) + { + std::string sOut2; + LoadAdminMessages(false,sOut2); + if (!fLoadingIndex && !IsCPIDValidv2(bb,height1)) { - //Mint limiter checks 1-20-2015 - double PORDiff = GetBlockDifficulty(nBits); - double mint1 = CoinToDouble(Mint); - double total_subsidy = bb.ResearchSubsidy + bb.InterestSubsidy; - double limiter = MintLimiter(PORDiff,bb.RSAWeight,bb.cpid,GetBlockTime()); - if (fDebug10) printf("CheckBlock[]: TotalSubsidy %f, Height %f, %s, %f, Res %f, Interest %f, hb: %s \r\n", - (double)total_subsidy,(double)height1, bb.cpid.c_str(), - (double)mint1,bb.ResearchSubsidy,bb.InterestSubsidy,vtx[0].hashBoinc.c_str()); - if (total_subsidy < limiter) - { - if (fDebug3) printf("****CheckBlock[]: Total Mint too Small %s, mint %f, Res %f, Interest %f, hash %s \r\n",bb.cpid.c_str(), - (double)mint1,bb.ResearchSubsidy,bb.InterestSubsidy,vtx[0].hashBoinc.c_str()); - //1-21-2015 - Prevent Hackers from spamming the network with small blocks - return error("****CheckBlock[]: Total Mint too Small %f < %f Research %f Interest %f BOINC %s", - total_subsidy,limiter,bb.ResearchSubsidy,bb.InterestSubsidy,vtx[0].hashBoinc.c_str()); - } - - if (fCheckSig && !CheckBlockSignature()) - return DoS(100, error("CheckBlock[] : bad proof-of-stake block signature")); + return error("Bad CPID or Block Signature : height %i, CPID %s, cpidv2 %s, LBH %s, Bad Hashboinc %s", height1, + bb.cpid.c_str(), bb.cpidv2.c_str(), + bb.lastblockhash.c_str(), vtx[0].hashBoinc.c_str()); } - - } - else + } + + // Gridcoin: check proof-of-stake block signature + if (IsProofOfStake() && height1 > nGrandfather) + { + //Mint limiter checks 1-20-2015 + double PORDiff = GetBlockDifficulty(nBits); + double mint1 = CoinToDouble(Mint); + double total_subsidy = bb.ResearchSubsidy + bb.InterestSubsidy; + double limiter = MintLimiter(PORDiff,bb.RSAWeight,bb.cpid,GetBlockTime()); + if (fDebug10) printf("CheckBlock[]: TotalSubsidy %f, Height %i, %s, %f, Res %f, Interest %f, hb: %s \r\n", + total_subsidy, height1, bb.cpid.c_str(), + mint1,bb.ResearchSubsidy,bb.InterestSubsidy,vtx[0].hashBoinc.c_str()); + if (total_subsidy < limiter) { - return false; + if (fDebug3) printf("****CheckBlock[]: Total Mint too Small %s, mint %f, Res %f, Interest %f, hash %s \r\n",bb.cpid.c_str(), + mint1,bb.ResearchSubsidy,bb.InterestSubsidy,vtx[0].hashBoinc.c_str()); + //1-21-2015 - Prevent Hackers from spamming the network with small blocks + return error("****CheckBlock[]: Total Mint too Small %f < %f Research %f Interest %f BOINC %s", + total_subsidy,limiter,bb.ResearchSubsidy,bb.InterestSubsidy,vtx[0].hashBoinc.c_str()); } - // End of Proof Of Research + if (fCheckSig && !CheckBlockSignature()) + return DoS(100, error("CheckBlock[] : bad proof-of-stake block signature")); + } + // End of Proof Of Research if (IsProofOfStake()) { // Coinbase output should be empty if proof-of-stake block @@ -3934,7 +3955,6 @@ bool CBlock::CheckBlock(std::string sCaller, int height1, int64_t Mint, bool fCh return DoS(100, error("CheckBlock[] : more than one coinstake")); } } - } // Check transactions @@ -4062,6 +4082,12 @@ bool CBlock::AcceptBlock(bool generated_by_me) } } + // Verify proof of research. + if(!CheckProofOfResearch(pindexPrev, *this)) + { + return error("WARNING: AcceptBlock(): check proof-of-research failed for block %s, nonce %i\n", hash.ToString().c_str(), nNonce); + } + // PoW is checked in CheckBlock[] if (IsProofOfWork()) { diff --git a/src/main.h b/src/main.h index 809a4f8160..d80ad095f4 100755 --- a/src/main.h +++ b/src/main.h @@ -247,6 +247,11 @@ double GetBlockDifficulty(unsigned int nBits); std::string ExtractXML(std::string XMLdata, std::string key, std::string key_end); bool CheckProofOfWork(uint256 hash, unsigned int nBits); +// Validate researcher rewards. +bool CheckProofOfResearch( + const CBlockIndex* pindexPrev, //previous block in chain index + const CBlock &block); //block to check + unsigned int GetNextTargetRequired(const CBlockIndex* pindexLast, bool fProofOfStake); int64_t GetProofOfWorkReward(int64_t nFees, int64_t locktime, int64_t height); From e86585922ca486a778428790becad03da7472d66 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Fri, 29 Sep 2017 08:54:25 +0200 Subject: [PATCH 25/37] Remove tally request rate limits. --- src/main.cpp | 21 +++------------------ src/main.h | 2 -- src/net.cpp | 12 +++++------- src/rpcblockchain.cpp | 1 - 4 files changed, 8 insertions(+), 28 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c155876b0e..45d2e59f65 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -147,11 +147,9 @@ CTxMemPool mempool; unsigned int nTransactionsUpdated = 0; unsigned int REORGANIZE_FAILED = 0; unsigned int WHITELISTED_PROJECTS = 0; -int64_t nLastTallied = 0; int64_t nLastPing = 0; int64_t nLastAskedForBlocks = 0; int64_t nBootup = 0; -int64_t nLastTallyBusyWait = 0; int64_t nLastTalliedNeural = 0; int64_t nLastLoadAdminMessages = 0; @@ -3251,7 +3249,6 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck, boo if (fDebug3) printf("ConnectBlock(): Superblock Loaded %d \r\n", pindex->nHeight); /* Reserved for future use: bNetAveragesLoaded=false; - nLastTallied = 0; BsyWaitForTally(); */ if (!fColdBoot) @@ -5494,20 +5491,10 @@ bool TallyResearchAverages(bool Forcefully) return true; } - //if (Forcefully) nLastTallied = 0; - int timespan = fTestNet ? 2 : 6; - if (IsLockTimeWithinMinutes(nLastTallied,timespan)) - { - bNetAveragesLoaded=true; - return true; - } - //8-27-2016 - int64_t nStart = GetTimeMillis(); - + int64_t nStart = GetTimeMillis(); if (fDebug) printf("Tallying Research Averages (begin) "); - nLastTallied = GetAdjustedTime(); bNetAveragesLoaded = false; bool superblockloaded = false; double NetworkPayments = 0; @@ -5538,7 +5525,7 @@ bool TallyResearchAverages(bool Forcefully) if (fDebug3) printf("Max block %f, seektime %f",(double)pblockindex->nHeight,(double)GetTimeMillis()-nStart); nStart=GetTimeMillis(); - + // Headless critical section () try { @@ -5600,17 +5587,15 @@ bool TallyResearchAverages(bool Forcefully) { printf("Bad Alloc while tallying network averages. [1]\r\n"); bNetAveragesLoaded=true; - nLastTallied = 0; } catch(...) { printf("Error while tallying network averages. [1]\r\n"); bNetAveragesLoaded=true; - nLastTallied = 0; } if (fDebug3) printf("NA loaded in %f",(double)GetTimeMillis()-nStart); - + bNetAveragesLoaded=true; return false; } diff --git a/src/main.h b/src/main.h index d80ad095f4..5e1fff297d 100755 --- a/src/main.h +++ b/src/main.h @@ -159,7 +159,6 @@ extern bool bOPReturnEnabled; extern int64_t nTransactionFee; extern int64_t nReserveBalance; extern int64_t nMinimumInputValue; -extern int64_t nLastTallied; extern int64_t nLastPing; extern int64_t nLastAskedForBlocks; extern int64_t nBootup; @@ -167,7 +166,6 @@ extern int64_t nLastTalliedNeural; extern int64_t nCPIDsLoaded; extern int64_t nLastGRCtallied; extern int64_t nLastCleaned; -extern int64_t nLastTallyBusyWait; extern bool fUseFastIndex; extern unsigned int nDerivationMethodIndex; diff --git a/src/net.cpp b/src/net.cpp index 6f5ca89ec8..a26ccc6597 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1605,21 +1605,19 @@ void ThreadTallyResearchAverages(void* parg) void BusyWaitForTally() { - if (IsLockTimeWithinMinutes(nLastTallyBusyWait,10)) - { - return; - } if (fDebug10) printf("\r\n ** Busy Wait for Tally ** \r\n"); bTallyFinished=false; bDoTally=true; int iTimeout = 0; + + int64_t deadline = GetAdjustedTime() + 15000; while(!bTallyFinished) { - MilliSleep(1); + MilliSleep(10); + if(GetAdjustedTime() >= deadline) + break; iTimeout+=1; - if (iTimeout > 15000) break; } - nLastTallyBusyWait = GetAdjustedTime(); } diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 069a584384..83b7fe1d5b 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -2047,7 +2047,6 @@ Value execute(const Array& params, bool fHelp) else if (sItem == "tally") { bNetAveragesLoaded = false; - nLastTallied = 0; TallyResearchAverages(true); entry.push_back(Pair("Tally Network Averages",1)); results.push_back(entry); From 01a31414ad49f49b15a3e50e0920e48f6c0bddd4 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Fri, 29 Sep 2017 09:37:32 +0200 Subject: [PATCH 26/37] Strict tally rules. Try to get a synchronized tally rate across the network by following strict tally rules: - Tally after loading blocks on startup - Tally on block height % 60 == 0 - Tally after reorganize This should fix research reward errors due to tally desync, #245 and #641. This also removes the need for a separate tally thread and a busy sleep. --- src/global_objects_noui.hpp | 2 - src/init.cpp | 11 +- src/main.cpp | 248 +++++++++++++++--------------------- src/net.cpp | 84 ------------ src/rpcblockchain.cpp | 8 -- 5 files changed, 108 insertions(+), 245 deletions(-) diff --git a/src/global_objects_noui.hpp b/src/global_objects_noui.hpp index 724c99b8c4..182d7b11f5 100755 --- a/src/global_objects_noui.hpp +++ b/src/global_objects_noui.hpp @@ -14,8 +14,6 @@ extern bool bForceUpdate; extern bool bCheckedForUpgrade; extern bool bCheckedForUpgradeLive; extern bool bGlobalcomInitialized; -extern bool bDoTally; -extern bool bTallyFinished; extern bool bGridcoinGUILoaded; struct StructCPID diff --git a/src/init.cpp b/src/init.cpp index 144f6bb80f..eaf5fbadc1 100755 --- a/src/init.cpp +++ b/src/init.cpp @@ -24,7 +24,8 @@ bool LoadAdminMessages(bool bFullTableScan,std::string& out_errors); StructCPID GetStructCPID(); bool ComputeNeuralNetworkSupermajorityHashes(); -void BusyWaitForTally(); +void TallyNetworkAverages(); +extern void ThreadAppInit2(void* parg); void LoadCPIDsInBackground(); bool IsConfigFileEmpty(); @@ -992,12 +993,12 @@ bool AppInit2(ThreadHandlerPtr threads) } - uiInterface.InitMessage(_("Loading Network Averages...")); + uiInterface.InitMessage(_("Loading Network Averages...")); if (fDebug3) printf("Loading network averages"); - if (!threads->createThread(StartNode, NULL, "Start Thread")) + TallyNetworkAverages(); - InitError(_("Error: could not start node")); - BusyWaitForTally(); + if (!threads->createThread(StartNode, NULL, "Start Thread")) + InitError(_("Error: could not start node")); if (fServer) threads->createThread(ThreadRPCServer, NULL, "RPC Server Thread"); diff --git a/src/main.cpp b/src/main.cpp index 45d2e59f65..66b6e09595 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -51,7 +51,7 @@ bool RequestSupermajorityNeuralData(); extern bool AskForOutstandingBlocks(uint256 hashStart); extern bool CleanChain(); extern void ResetTimerMain(std::string timer_name); -extern bool TallyResearchAverages(bool Forcefully); +extern bool TallyResearchAverages(); extern void IncrementCurrentNeuralNetworkSupermajority(std::string NeuralHash, std::string GRCAddress, double distance); bool VerifyCPIDSignature(std::string sCPID, std::string sBlockHash, std::string sSignature); int DetermineCPIDType(std::string cpid); @@ -62,8 +62,7 @@ extern double ExtractMagnitudeFromExplainMagnitude(); extern void GridcoinServices(); extern double SnapToGrid(double d); extern bool StrLessThanReferenceHash(std::string rh); -void BusyWaitForTally(); -extern bool TallyNetworkAverages(bool Forcefully); +extern bool TallyNetworkAverages(); extern bool IsContract(CBlockIndex* pIndex); std::string ExtractValue(std::string data, std::string delimiter, int pos); extern MiningCPID GetBoincBlockByIndex(CBlockIndex* pblockindex); @@ -261,8 +260,6 @@ bool bCheckedForUpgrade = false; bool bCheckedForUpgradeLive = false; bool bGlobalcomInitialized = false; bool bStakeMinerOutOfSyncWithNetwork = false; -bool bDoTally = false; -bool bTallyFinished = false; bool bGridcoinGUILoaded = false; extern double LederstrumpfMagnitude2(double Magnitude, int64_t locktime); @@ -2184,19 +2181,11 @@ bool CheckProofOfResearch( // TODO: Remove this tally? if (bb.ResearchSubsidy > ((OUT_POR*1.25)+1)) { - BusyWaitForTally(); - StructCPID st1 = GetLifetimeCPID(bb.cpid,"CheckProofOfResearch()"); - nCalculatedResearch = GetProofOfStakeReward(nCoinAge, nFees, bb.cpid, true, 2, block.nTime, - pindexBest, "checkblock_researcher_doublecheck", OUT_POR, OUT_INTEREST, dAccrualAge, dMagnitudeUnit, dAvgMagnitude); + if (fDebug3) printf("CheckProofOfResearch: Researchers Reward Pays too much : Interest %f and Research %f and StakeReward %f, OUT_POR %f, with Out_Interest %f for CPID %s ", + bb.InterestSubsidy, bb.ResearchSubsidy, CoinToDouble(nCalculatedResearch), OUT_POR, OUT_INTEREST, bb.cpid.c_str()); - if (bb.ResearchSubsidy > ((OUT_POR*1.25)+1)) - { - if (fDebug3) printf("CheckProofOfResearch: Researchers Reward Pays too much : Interest %f and Research %f and StakeReward %f, OUT_POR %f, with Out_Interest %f for CPID %s ", - bb.InterestSubsidy, bb.ResearchSubsidy, CoinToDouble(nCalculatedResearch), OUT_POR, OUT_INTEREST, bb.cpid.c_str()); - - return block.DoS(10,error("CheckProofOfResearch: Researchers Reward Pays too much : Interest %f and Research %f and StakeReward %f, OUT_POR %f, with Out_Interest %f for CPID %s ", - bb.InterestSubsidy, bb.ResearchSubsidy,CoinToDouble(nCalculatedResearch), OUT_POR, OUT_INTEREST, bb.cpid.c_str())); - } + return block.DoS(10,error("CheckProofOfResearch: Researchers Reward Pays too much : Interest %f and Research %f and StakeReward %f, OUT_POR %f, with Out_Interest %f for CPID %s ", + bb.InterestSubsidy, bb.ResearchSubsidy,CoinToDouble(nCalculatedResearch), OUT_POR, OUT_INTEREST, bb.cpid.c_str())); } return true; @@ -3146,7 +3135,6 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck, boo { if (bb.ResearchSubsidy > (GetOwedAmount(bb.cpid)+1)) { - bDoTally=true; if (bb.ResearchSubsidy > (GetOwedAmount(bb.cpid)+1)) { StructCPID strUntrustedHost = GetInitializedStructCPID2(bb.cpid,mvMagnitudes); @@ -3247,14 +3235,6 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck, boo { LoadSuperblock(superblock,pindex->nTime,pindex->nHeight); if (fDebug3) printf("ConnectBlock(): Superblock Loaded %d \r\n", pindex->nHeight); - /* Reserved for future use: - bNetAveragesLoaded=false; - BsyWaitForTally(); - */ - if (!fColdBoot) - { - bDoTally = true; - } } else { @@ -3307,18 +3287,9 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck, boo LoadAdminMessages(false,errors1); } - // Slow down Retallying when in RA mode so we minimize disruption of the network - if ( (pindex->nHeight % 60 == 0) && IsResearchAgeEnabled(pindex->nHeight) && BlockNeedsChecked(pindex->nTime)) + if (IsResearchAgeEnabled(pindex->nHeight) && !OutOfSyncByAge()) { - if (fDebug3) printf("\r\n*BusyWaitForTally*\r\n"); - BusyWaitForTally(); - } - - - if (IsResearchAgeEnabled(pindex->nHeight) && !OutOfSyncByAge()) - { - fColdBoot = false; - bDoTally=true; + fColdBoot = false; } if (fJustCheck) @@ -3603,8 +3574,8 @@ bool CBlock::SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew) printf("Failed to Reorganize during Attempt #%f \r\n",(double)iRegression+1); txdb.TxnAbort(); InvalidChainFound(pindexNew); - printf("\r\nReorg BusyWait\r\n"); - BusyWaitForTally(); + printf("\r\nReorg tally\r\n"); + TallyNetworkAverages(); REORGANIZE_FAILED++; return error("SetBestChain() : Reorganize failed"); } @@ -3862,14 +3833,6 @@ bool CBlock::CheckBlock(std::string sCaller, int height1, int64_t Mint, bool fCh //Research Age MiningCPID bb = DeserializeBoincBlock(vtx[0].hashBoinc,nVersion); //For higher security, plus lets catch these bad blocks before adding them to the chain to prevent reorgs: - double OUT_POR = 0; - double OUT_INTEREST = 0; - double dAccrualAge = 0; - double dMagnitudeUnit = 0; - double dAvgMagnitude = 0; - uint64_t nCoinAge = 0; - int64_t nFees = 0; - if (bb.cpid != "INVESTOR" && IsProofOfStake() && height1 > nGrandfather && IsResearchAgeEnabled(height1) && BlockNeedsChecked(nTime) && !fLoadingIndex) { double blockVersion = BlockVersion(bb.clientversion); @@ -4329,11 +4292,6 @@ void GridcoinServices() ComputeNeuralNetworkSupermajorityHashes(); UpdateNeuralNetworkQuorumData(); } - if ((nBestHeight % 20) == 0) - { - if (fDebug10) printf("#TIB# "); - bDoTally = true; - } } else { @@ -4341,10 +4299,8 @@ void GridcoinServices() int nTallyGranularity = fTestNet ? 60 : 20; if ((nBestHeight % nTallyGranularity) == 0) { - if (fDebug3) printf("TIB1 "); - bDoTally = true; - if (fDebug3) printf("CNNSH2 "); - ComputeNeuralNetworkSupermajorityHashes(); + TallyNetworkAverages(); + ComputeNeuralNetworkSupermajorityHashes(); } if ((nBestHeight % 5)==0) @@ -5482,8 +5438,8 @@ bool ComputeNeuralNetworkSupermajorityHashes() } -bool TallyResearchAverages(bool Forcefully) -{ +bool TallyResearchAverages() +{ //Iterate throught last 14 days, tally network averages if (nBestHeight < 15) { @@ -5500,113 +5456,113 @@ bool TallyResearchAverages(bool Forcefully) double NetworkPayments = 0; double NetworkInterest = 0; - //Consensus Start/End block: - int nMaxDepth = (nBestHeight-CONSENSUS_LOOKBACK) - ( (nBestHeight-CONSENSUS_LOOKBACK) % BLOCK_GRANULARITY); - int nLookback = BLOCKS_PER_DAY * 14; //Daily block count * Lookback in days - int nMinDepth = (nMaxDepth - nLookback) - ( (nMaxDepth-nLookback) % BLOCK_GRANULARITY); - if (fDebug3) printf("START BLOCK %f, END BLOCK %f ",(double)nMaxDepth,(double)nMinDepth); - if (nMinDepth < 2) nMinDepth = 2; - mvMagnitudesCopy.clear(); - int iRow = 0; - //CBlock block; - CBlockIndex* pblockindex = pindexBest; - if (!pblockindex) - { - bTallyStarted = false; - bNetAveragesLoaded = true; - return true; - } - while (pblockindex->nHeight > nMaxDepth) - { - if (!pblockindex || !pblockindex->pprev || pblockindex == pindexGenesisBlock) return false; - pblockindex = pblockindex->pprev; - } + //Consensus Start/End block: + int nMaxDepth = (nBestHeight-CONSENSUS_LOOKBACK) - ( (nBestHeight-CONSENSUS_LOOKBACK) % BLOCK_GRANULARITY); + int nLookback = BLOCKS_PER_DAY * 14; //Daily block count * Lookback in days + int nMinDepth = (nMaxDepth - nLookback) - ( (nMaxDepth-nLookback) % BLOCK_GRANULARITY); + if (fDebug3) printf("START BLOCK %f, END BLOCK %f ",(double)nMaxDepth,(double)nMinDepth); + if (nMinDepth < 2) nMinDepth = 2; + mvMagnitudesCopy.clear(); + int iRow = 0; + //CBlock block; + CBlockIndex* pblockindex = pindexBest; + if (!pblockindex) + { + bTallyStarted = false; + bNetAveragesLoaded = true; + return true; + } + while (pblockindex->nHeight > nMaxDepth) + { + if (!pblockindex || !pblockindex->pprev || pblockindex == pindexGenesisBlock) return false; + pblockindex = pblockindex->pprev; + } - if (fDebug3) printf("Max block %f, seektime %f",(double)pblockindex->nHeight,(double)GetTimeMillis()-nStart); - nStart=GetTimeMillis(); + if (fDebug3) printf("Max block %f, seektime %f",(double)pblockindex->nHeight,(double)GetTimeMillis()-nStart); + nStart=GetTimeMillis(); - // Headless critical section () - try + // Headless critical section () + try + { + while (pblockindex->nHeight > nMinDepth) { - while (pblockindex->nHeight > nMinDepth) - { - if (!pblockindex || !pblockindex->pprev) return false; - pblockindex = pblockindex->pprev; - if (pblockindex == pindexGenesisBlock) return false; - if (!pblockindex->IsInMainChain()) continue; - NetworkPayments += pblockindex->nResearchSubsidy; - NetworkInterest += pblockindex->nInterestSubsidy; - AddResearchMagnitude(pblockindex); + if (!pblockindex || !pblockindex->pprev) return false; + pblockindex = pblockindex->pprev; + if (pblockindex == pindexGenesisBlock) return false; + if (!pblockindex->IsInMainChain()) continue; + NetworkPayments += pblockindex->nResearchSubsidy; + NetworkInterest += pblockindex->nInterestSubsidy; + AddResearchMagnitude(pblockindex); - iRow++; - if (IsSuperBlock(pblockindex) && !superblockloaded) - { - MiningCPID bb = GetBoincBlockByIndex(pblockindex); - if (bb.superblock.length() > 20) - { - std::string superblock = UnpackBinarySuperblock(bb.superblock); - if (VerifySuperblock(superblock, pblockindex)) - { - LoadSuperblock(superblock,pblockindex->nTime,pblockindex->nHeight); - superblockloaded=true; - if (fDebug) - printf(" Superblock Loaded %i", pblockindex->nHeight); - } - } - } + iRow++; + if (IsSuperBlock(pblockindex) && !superblockloaded) + { + MiningCPID bb = GetBoincBlockByIndex(pblockindex); + if (bb.superblock.length() > 20) + { + std::string superblock = UnpackBinarySuperblock(bb.superblock); + if (VerifySuperblock(superblock, pblockindex)) + { + LoadSuperblock(superblock,pblockindex->nTime,pblockindex->nHeight); + superblockloaded=true; + if (fDebug) + printf(" Superblock Loaded %i", pblockindex->nHeight); + } + } + } - } - // End of critical section - if (fDebug3) printf("TNA loaded in %" PRId64, GetTimeMillis()-nStart); - nStart=GetTimeMillis(); + } + // End of critical section + if (fDebug3) printf("TNA loaded in %" PRId64, GetTimeMillis()-nStart); + nStart=GetTimeMillis(); - if (pblockindex) - { - if (fDebug3) - printf("Min block %i, Rows %i", pblockindex->nHeight, iRow); - - StructCPID network = GetInitializedStructCPID2("NETWORK",mvNetworkCopy); - network.projectname="NETWORK"; - network.payments = NetworkPayments; - network.InterestSubsidy = NetworkInterest; - mvNetworkCopy["NETWORK"] = network; - if(fDebug3) printf(" TMIS1 "); - TallyMagnitudesInSuperblock(); - } - // 11-19-2015 Copy dictionaries to live RAM - mvDPOR = mvDPORCopy; - mvMagnitudes = mvMagnitudesCopy; - mvNetwork = mvNetworkCopy; - bTallyStarted = false; - bNetAveragesLoaded = true; - return true; - } - catch (bad_alloc ba) - { - printf("Bad Alloc while tallying network averages. [1]\r\n"); - bNetAveragesLoaded=true; - } - catch(...) + if (pblockindex) { - printf("Error while tallying network averages. [1]\r\n"); - bNetAveragesLoaded=true; + if (fDebug3) + printf("Min block %i, Rows %i", pblockindex->nHeight, iRow); + + StructCPID network = GetInitializedStructCPID2("NETWORK",mvNetworkCopy); + network.projectname="NETWORK"; + network.payments = NetworkPayments; + network.InterestSubsidy = NetworkInterest; + mvNetworkCopy["NETWORK"] = network; + if(fDebug3) printf(" TMIS1 "); + TallyMagnitudesInSuperblock(); } + // 11-19-2015 Copy dictionaries to live RAM + mvDPOR = mvDPORCopy; + mvMagnitudes = mvMagnitudesCopy; + mvNetwork = mvNetworkCopy; + bTallyStarted = false; + bNetAveragesLoaded = true; + return true; + } + catch (bad_alloc ba) + { + printf("Bad Alloc while tallying network averages. [1]\r\n"); + bNetAveragesLoaded=true; + } + catch(...) + { + printf("Error while tallying network averages. [1]\r\n"); + bNetAveragesLoaded=true; + } - if (fDebug3) printf("NA loaded in %f",(double)GetTimeMillis()-nStart); + if (fDebug3) printf("NA loaded in %f",(double)GetTimeMillis()-nStart); - bNetAveragesLoaded=true; - return false; + bNetAveragesLoaded=true; + return false; } -bool TallyNetworkAverages(bool Forcefully) +bool TallyNetworkAverages() { if (IsResearchAgeEnabled(pindexBest->nHeight)) { - return TallyResearchAverages(Forcefully); + return TallyResearchAverages(); } return false; diff --git a/src/net.cpp b/src/net.cpp index a26ccc6597..fe3ae1b07c 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -26,8 +26,6 @@ #endif using namespace std; -bool TallyNetworkAverages(bool ColdBoot); -extern void DoTallyResearchAverages(void* parg); std::string DefaultWalletAddress(); std::string NodeAddress(CNode* pfrom); @@ -1573,84 +1571,6 @@ void DumpAddresses() } -void ThreadTallyResearchAverages(void* parg) -{ - // Make this thread recognisable - RenameThread("grc-tallyresearchaverages"); - -begin: - try - { - DoTallyResearchAverages(parg); - } - catch (std::exception& e) - { - PrintException(&e, "ThreadTallyNetworkAverages()"); - } - catch(boost::thread_interrupted&) - { - printf("ThreadTallyResearchAverages exited (interrupt)\r\n"); - return; - } - catch(...) - { - printf("Error in ThreadTallyResearchAverages... Recovering \r\n"); - } - MilliSleep(10000); - if (!fShutdown) printf("Thread TallyReasearchAverages exited, Restarting.. \r\n"); - if (!fShutdown) goto begin; - printf("ThreadTallyResearchAverages exited \r\n"); -} - - -void BusyWaitForTally() -{ - if (fDebug10) printf("\r\n ** Busy Wait for Tally ** \r\n"); - bTallyFinished=false; - bDoTally=true; - int iTimeout = 0; - - int64_t deadline = GetAdjustedTime() + 15000; - while(!bTallyFinished) - { - MilliSleep(10); - if(GetAdjustedTime() >= deadline) - break; - iTimeout+=1; - } -} - - -void DoTallyResearchAverages(void* parg) -{ - printf("\r\nStarting dedicated Tally thread...\r\n"); - - while (!fShutdown) - { - MilliSleep(100); - if (bDoTally) - { - bTallyFinished = false; - bDoTally=false; - printf("\r\n[DoTallyRA_START] "); - try - { - TallyNetworkAverages(false); - } - catch (std::exception& e) - { - PrintException(&e, "ThreadTallyNetworkAverages()"); - } - catch(...) - { - printf("\r\nError occurred in DoTallyResearchAverages...Recovering\r\n"); - } - printf(" [DoTallyRA_END] \r\n"); - bTallyFinished = true; - } - } -} - void ThreadDumpAddress2(void* parg) { while (!fShutdown) @@ -2320,10 +2240,6 @@ void StartNode(void* parg) // Dump network addresses if (!netThreads->createThread(ThreadDumpAddress,NULL,"ThreadDumpAddress")) printf("Error: createThread(ThreadDumpAddress) failed\r\n"); - - // Tally network averages - if (!NewThread(ThreadTallyResearchAverages, NULL)) - printf("Error; NewThread(ThreadTally) failed\n"); // Mine proof-of-stake blocks in the background if (!GetBoolArg("-staking", true)) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 83b7fe1d5b..262c809027 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -42,7 +42,6 @@ extern Array MagnitudeReport(std::string cpid); std::string ConvertBinToHex(std::string a); std::string ConvertHexToBin(std::string a); extern std::vector readFileToVector(std::string filename); -bool TallyResearchAverages(bool Forcefully); int RestartClient(); extern std::string SignBlockWithCPID(std::string sCPID, std::string sBlockHash); std::string BurnCoinsWithNewContract(bool bAdd, std::string sType, std::string sPrimaryKey, std::string sValue, int64_t MinimumBalance, double dFees, std::string strPublicKey, std::string sBurnAddress); @@ -2044,13 +2043,6 @@ Value execute(const Array& params, bool fHelp) entry.push_back(Pair("Requested a quorum - waiting for resolution.",1)); results.push_back(entry); } - else if (sItem == "tally") - { - bNetAveragesLoaded = false; - TallyResearchAverages(true); - entry.push_back(Pair("Tally Network Averages",1)); - results.push_back(entry); - } else if (sItem == "encrypt") { //Encrypt a phrase From 58321706ad391b97610e5fddde584ff1af195139 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Fri, 29 Sep 2017 09:58:31 +0200 Subject: [PATCH 27/37] Remove superblock loading from testnewcontract RPC. --- src/rpcblockchain.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 262c809027..2d9e559e0e 100755 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -2016,7 +2016,6 @@ Value execute(const Array& params, bool fHelp) entry.push_back(Pair("My Neural Hash",myNeuralHash.c_str())); results.push_back(entry); #endif - LoadSuperblock(contract,GetAdjustedTime(),280000); entry.push_back(Pair("Contract Test",contract)); // Convert to Binary std::string sBin = PackBinarySuperblock(contract); From 4bb3305d09fd4bc1920895adb61bc2ede5bfd70c Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Fri, 29 Sep 2017 10:10:06 +0200 Subject: [PATCH 28/37] Bump the grandfather block. --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 66b6e09595..834571f9e7 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -310,7 +310,7 @@ std::string msNeuralResponse; std::string msHDDSerial; //When syncing, we grandfather block rejection rules up to this block, as rules became stricter over time and fields changed -int nGrandfather = 1034700; +int nGrandfather = 1035000; int nNewIndex = 271625; int nNewIndex2 = 364500; From 817283016569c5ea403ab288dd906c62f772211e Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Sat, 7 Oct 2017 15:39:59 +0200 Subject: [PATCH 29/37] Remove stray whitespaces. --- src/init.cpp | 4 ++-- src/main.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index eaf5fbadc1..176cf31462 100755 --- a/src/init.cpp +++ b/src/init.cpp @@ -993,12 +993,12 @@ bool AppInit2(ThreadHandlerPtr threads) } - uiInterface.InitMessage(_("Loading Network Averages...")); + uiInterface.InitMessage(_("Loading Network Averages...")); if (fDebug3) printf("Loading network averages"); TallyNetworkAverages(); if (!threads->createThread(StartNode, NULL, "Start Thread")) - InitError(_("Error: could not start node")); + InitError(_("Error: could not start node")); if (fServer) threads->createThread(ThreadRPCServer, NULL, "RPC Server Thread"); diff --git a/src/main.cpp b/src/main.cpp index 834571f9e7..406c7b7a95 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -5439,7 +5439,7 @@ bool ComputeNeuralNetworkSupermajorityHashes() bool TallyResearchAverages() -{ +{ //Iterate throught last 14 days, tally network averages if (nBestHeight < 15) { From 6fbcf25809f03a4d5588a856674f218e677a0283 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Sun, 8 Oct 2017 17:19:18 +0200 Subject: [PATCH 30/37] Remove unused bTallyStarted. --- src/main.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 406c7b7a95..47c444955e 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -254,7 +254,6 @@ extern std::string RetrieveMd5(std::string s1); extern std::string aes_complex_hash(uint256 scrypt_hash); bool bNetAveragesLoaded = false; -bool bTallyStarted = false; bool bForceUpdate = false; bool bCheckedForUpgrade = false; bool bCheckedForUpgradeLive = false; @@ -4235,11 +4234,6 @@ void GridcoinServices() printf("Daily backup results: Wallet -> %s Config -> %s\r\n", (bWalletBackupResults ? "true" : "false"), (bConfigBackupResults ? "true" : "false")); } - if (TimerMain("ResetVars",30)) - { - bTallyStarted = false; - } - if (false && TimerMain("FixSpentCoins",60)) { int nMismatchSpent; @@ -5464,11 +5458,10 @@ bool TallyResearchAverages() if (nMinDepth < 2) nMinDepth = 2; mvMagnitudesCopy.clear(); int iRow = 0; - //CBlock block; + CBlockIndex* pblockindex = pindexBest; if (!pblockindex) { - bTallyStarted = false; bNetAveragesLoaded = true; return true; } @@ -5535,7 +5528,6 @@ bool TallyResearchAverages() mvDPOR = mvDPORCopy; mvMagnitudes = mvMagnitudesCopy; mvNetwork = mvNetworkCopy; - bTallyStarted = false; bNetAveragesLoaded = true; return true; } From 949d96355fbb7fc26c950f234b4945fa8cb5df22 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Sat, 21 Oct 2017 08:02:10 +0200 Subject: [PATCH 31/37] Disconnect tallying from superblock requirements. Also simplify quorum collections to always trigger every 3 blocks regardless of the current superblock state. Needs testing. --- src/main.cpp | 40 ++++++++-------------------------------- src/main.h | 3 ++- 2 files changed, 10 insertions(+), 33 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 47c444955e..26c6c4addb 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -4269,41 +4269,17 @@ void GridcoinServices() } } - int64_t superblock_age = GetAdjustedTime() - mvApplicationCacheTimestamp["superblock;magnitudes"]; - bool bNeedSuperblock = (superblock_age > (GetSuperblockAgeSpacing(nBestHeight))); - if ( nBestHeight % 3 == 0 && NeedASuperblock() ) bNeedSuperblock=true; - - if (fDebug10) + // Update quorum data. + if ((nBestHeight % 3) == 0) { - printf (" MRSA %" PRId64 ", BH %d", superblock_age, nBestHeight); - } - - if (bNeedSuperblock) - { - if ((nBestHeight % 3) == 0) - { - if (fDebug10) printf("#CNNSH# "); - ComputeNeuralNetworkSupermajorityHashes(); - UpdateNeuralNetworkQuorumData(); - } - } - else - { - // When superblock is not old, Tally every N mins: - int nTallyGranularity = fTestNet ? 60 : 20; - if ((nBestHeight % nTallyGranularity) == 0) - { - TallyNetworkAverages(); - ComputeNeuralNetworkSupermajorityHashes(); - } - - if ((nBestHeight % 5)==0) - { - UpdateNeuralNetworkQuorumData(); - } - + ComputeNeuralNetworkSupermajorityHashes(); + UpdateNeuralNetworkQuorumData(); } + // Tally research averages. + if ((nBestHeight % TALLY_GRANULARITY) == 0) + TallyNetworkAverages(); + // Every N blocks as a Synchronized TEAM: if ((nBestHeight % 30) == 0) { diff --git a/src/main.h b/src/main.h index 5e1fff297d..fa03b0e8b0 100755 --- a/src/main.h +++ b/src/main.h @@ -30,7 +30,8 @@ static const int LAST_POW_BLOCK = 2050; extern unsigned int REORGANIZE_FAILED; extern unsigned int WHITELISTED_PROJECTS; static const int CONSENSUS_LOOKBACK = 5; //Amount of blocks to go back from best block, to avoid counting forked blocks -static const int BLOCK_GRANULARITY = 10; //Consensus block divisor +static const int BLOCK_GRANULARITY = 10; //Consensus block divisor +static const int TALLY_GRANULARITY = BLOCK_GRANULARITY; static const double NeuralNetworkMultiplier = 115000; From 066bcdf738866c8614b391b9c96525b5877b0d82 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Sat, 21 Oct 2017 08:13:44 +0200 Subject: [PATCH 32/37] Simplify tally range calculations. --- src/main.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 26c6c4addb..ce80cbe308 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -5427,11 +5427,14 @@ bool TallyResearchAverages() double NetworkInterest = 0; //Consensus Start/End block: - int nMaxDepth = (nBestHeight-CONSENSUS_LOOKBACK) - ( (nBestHeight-CONSENSUS_LOOKBACK) % BLOCK_GRANULARITY); + int nMaxConensusDepth = nBestHeight - CONSENSUS_LOOKBACK; + int nMaxDepth = nMaxConensusDepth - (nMaxConensusDepth % TALLY_GRANULARITY); int nLookback = BLOCKS_PER_DAY * 14; //Daily block count * Lookback in days - int nMinDepth = (nMaxDepth - nLookback) - ( (nMaxDepth-nLookback) % BLOCK_GRANULARITY); - if (fDebug3) printf("START BLOCK %f, END BLOCK %f ",(double)nMaxDepth,(double)nMinDepth); - if (nMinDepth < 2) nMinDepth = 2; + int nMinDepth = nMaxDepth - nLookback; + if (nMinDepth < 2) + nMinDepth = 2; + + if (fDebug3) printf("START BLOCK %i, END BLOCK %i", nMaxDepth, nMinDepth); mvMagnitudesCopy.clear(); int iRow = 0; From b495b19488becf401a78f7983d62c9e316a5565c Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Tue, 24 Oct 2017 07:09:32 +0200 Subject: [PATCH 33/37] Remove commented out code. --- src/miner.cpp | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 8b0a3dbb10..71830adfad 100755 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -32,7 +32,6 @@ void ThreadTopUpKeyPool(void* parg); std::string SerializeBoincBlock(MiningCPID mcpid); bool LessVerbose(int iMax1000); -double CalculatedMagnitude2(std::string cpid, int64_t locktime,bool bUseLederstrumpf); int64_t GetRSAWeightByBlock(MiningCPID boincblock); std::string SignBlockWithCPID(std::string sCPID, std::string sBlockHash); std::string qtGetNeuralContract(std::string data); @@ -727,20 +726,6 @@ bool CreateGridcoinReward(CBlock &blocknew, MiningCPID& miningcpid, uint64_t &nC uint256 pbh = 0; pbh=pindexPrev->GetBlockHash(); - /* This is should be already done in GetNextProject - miningcpid.cpidv2 = ComputeCPIDv2( - GlobalCPUMiningCPID.email, - GlobalCPUMiningCPID.boincruntimepublickey, - pbh ); - - - miningcpid.Magnitude = CalculatedMagnitude2( - GlobalCPUMiningCPID.cpid, blocknew.nTime, - false ); - - miningcpid.RSAWeight = GetRSAWeightByCPID(GlobalCPUMiningCPID.cpid); - */ - miningcpid.lastblockhash = pbh.GetHex(); miningcpid.ResearchSubsidy = OUT_POR; miningcpid.ResearchSubsidy2 = OUT_POR; From 1c92c2e9810933c9c1e1d751c60646a9866c2291 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Tue, 24 Oct 2017 07:09:43 +0200 Subject: [PATCH 34/37] Remove PoW check which cannot happen anymore. --- src/main.cpp | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index ce80cbe308..7afbba4539 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -1794,21 +1794,6 @@ int64_t GetProofOfWorkReward(int64_t nFees, int64_t locktime, int64_t height) return nSubsidy + nFees; } - -int64_t GetProofOfWorkMaxReward(int64_t nFees, int64_t locktime, int64_t height) -{ - int64_t nSubsidy = (GetMaximumBoincSubsidy(locktime)+1) * COIN; - if (height==10) - { - //R.Halford: 10-11-2014: Gridcoin Foundation Block: - //Note: Gridcoin Classic emitted these coins. So we had to add them to block 10. The coins were burned then given back to the owners that mined them in classic (as research coins). - nSubsidy = nGenesisSupply * COIN; - } - - if (fTestNet) nSubsidy += 1000*COIN; - return nSubsidy + nFees; -} - //Survey Results: Start inflation rate: 9%, end=1%, 30 day steps, 9 steps, mag multiplier start: 2, mag end .3, 9 steps int64_t GetMaximumBoincSubsidy(int64_t nTime) { @@ -2967,16 +2952,6 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck, boo mapQueuedChanges[hashTx] = CTxIndex(posThisTx, tx.vout.size()); } - if (IsProofOfWork() && pindex->nHeight > nGrandfather) - { - int64_t nReward = GetProofOfWorkMaxReward(nFees,nTime,pindex->nHeight); - // Check coinbase reward - if (vtx[0].GetValueOut() > nReward) - return DoS(50, error("ConnectBlock[] : coinbase reward exceeded (actual=%" PRId64 " vs calculated=%" PRId64 ")", - vtx[0].GetValueOut(), - nReward)); - } - MiningCPID bb = DeserializeBoincBlock(vtx[0].hashBoinc,nVersion); uint64_t nCoinAge = 0; From 2f84f3262aa202890d1d5412b00192716efecc25 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Tue, 24 Oct 2017 12:40:12 +0200 Subject: [PATCH 35/37] Remove unused nTransactionsUpdated. --- src/init.cpp | 1 - src/main.cpp | 5 ----- src/main.h | 1 - src/net.cpp | 1 - 4 files changed, 8 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 176cf31462..922ce3a154 100755 --- a/src/init.cpp +++ b/src/init.cpp @@ -92,7 +92,6 @@ void Shutdown(void* parg) printf("gridcoinresearch exiting...\r\n"); fShutdown = true; - nTransactionsUpdated++; bitdb.Flush(false); StopNode(); bitdb.Flush(true); diff --git a/src/main.cpp b/src/main.cpp index 7afbba4539..bc9b6a6fbf 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -143,7 +143,6 @@ CCriticalSection cs_main; extern std::string NodeAddress(CNode* pfrom); CTxMemPool mempool; -unsigned int nTransactionsUpdated = 0; unsigned int REORGANIZE_FAILED = 0; unsigned int WHITELISTED_PROJECTS = 0; int64_t nLastPing = 0; @@ -1525,7 +1524,6 @@ bool CTxMemPool::addUnchecked(const uint256& hash, CTransaction &tx) mapTx[hash] = tx; for (unsigned int i = 0; i < tx.vin.size(); i++) mapNextTx[tx.vin[i].prevout] = CInPoint(&mapTx[hash], i); - nTransactionsUpdated++; } return true; } @@ -1549,7 +1547,6 @@ bool CTxMemPool::remove(const CTransaction &tx, bool fRecursive) for (auto const& txin : tx.vin) mapNextTx.erase(txin.prevout); mapTx.erase(hash); - nTransactionsUpdated++; } } return true; @@ -1576,7 +1573,6 @@ void CTxMemPool::clear() LOCK(cs); mapTx.clear(); mapNextTx.clear(); - ++nTransactionsUpdated; } void CTxMemPool::queryHashes(std::vector& vtxid) @@ -3591,7 +3587,6 @@ bool CBlock::SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew) nBestHeight = pindexBest->nHeight; nBestChainTrust = pindexNew->nChainTrust; nTimeBestReceived = GetAdjustedTime(); - nTransactionsUpdated++; uint256 nBestBlockTrust = pindexBest->nHeight != 0 ? (pindexBest->nChainTrust - pindexBest->pprev->nChainTrust) : pindexBest->nChainTrust; diff --git a/src/main.h b/src/main.h index fa03b0e8b0..a1b91626ac 100755 --- a/src/main.h +++ b/src/main.h @@ -146,7 +146,6 @@ extern uint256 nBestChainTrust; extern uint256 nBestInvalidTrust; extern uint256 hashBestChain; extern CBlockIndex* pindexBest; -extern unsigned int nTransactionsUpdated; extern const std::string strMessageMagic; extern int64_t nTimeBestReceived; extern CCriticalSection cs_setpwalletRegistered; diff --git a/src/net.cpp b/src/net.cpp index fe3ae1b07c..9709bc77d2 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -2253,7 +2253,6 @@ bool StopNode() { printf("StopNode()\n"); fShutdown = true; - nTransactionsUpdated++; if (semOutbound) for (int i=0; ipost(); From 1c671cf043dde5dc0670f3393d9fa0e510a196a3 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Tue, 24 Oct 2017 12:41:01 +0200 Subject: [PATCH 36/37] Don't reverse vSortedByTimestamp if we're going to sort it. --- src/kernel.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/kernel.cpp b/src/kernel.cpp index 9645b47f06..37f0f77e7d 100644 --- a/src/kernel.cpp +++ b/src/kernel.cpp @@ -165,8 +165,7 @@ bool ComputeNextStakeModifier(const CBlockIndex* pindexPrev, uint64_t& nStakeMod pindex = pindex->pprev; } int nHeightFirstCandidate = pindex ? (pindex->nHeight + 1) : 0; - reverse(vSortedByTimestamp.begin(), vSortedByTimestamp.end()); - sort(vSortedByTimestamp.begin(), vSortedByTimestamp.end()); + std::sort(vSortedByTimestamp.begin(), vSortedByTimestamp.end()); // Select 64 blocks from candidate blocks to generate stake modifier uint64_t nStakeModifierNew = 0; From 4755eeebbb979e0c9f3aa1030300f3551475cec6 Mon Sep 17 00:00:00 2001 From: Marco Nilsson Date: Tue, 24 Oct 2017 13:12:46 +0200 Subject: [PATCH 37/37] Slightly more efficient mapBlockIndex usage. Instead of counting items and then accessing, thus causing two map searches instead of one, just use the result of a find operation instead. --- src/kernel.cpp | 10 ++++++---- src/main.cpp | 22 ++++++++++++++-------- src/wallet.cpp | 5 +++-- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/kernel.cpp b/src/kernel.cpp index 37f0f77e7d..6148eba2fc 100644 --- a/src/kernel.cpp +++ b/src/kernel.cpp @@ -76,9 +76,10 @@ static bool SelectBlockFromCandidates(vector >& vSortedBy *pindexSelected = (const CBlockIndex*) 0; for (auto const& item : vSortedByTimestamp) { - if (!mapBlockIndex.count(item.second)) + const auto mapItem = mapBlockIndex.find(item.second); + if (mapItem == mapBlockIndex.end()) return error("SelectBlockFromCandidates: failed to find block index for candidate block %s", item.second.ToString().c_str()); - const CBlockIndex* pindex = mapBlockIndex[item.second]; + const CBlockIndex* pindex = mapItem->second; if (fSelected && pindex->GetBlockTime() > nSelectionIntervalStop) break; if (mapSelectedBlocks.count(pindex->GetBlockHash()) > 0) @@ -224,9 +225,10 @@ bool ComputeNextStakeModifier(const CBlockIndex* pindexPrev, uint64_t& nStakeMod static bool GetKernelStakeModifier(uint256 hashBlockFrom, uint64_t& nStakeModifier, int& nStakeModifierHeight, int64_t& nStakeModifierTime, bool fPrintProofOfStake) { nStakeModifier = 0; - if (!mapBlockIndex.count(hashBlockFrom)) + const auto mapItem = mapBlockIndex.find(hashBlockFrom); + if (mapItem == mapBlockIndex.end()) return error("GetKernelStakeModifier() : block not indexed"); - const CBlockIndex* pindexFrom = mapBlockIndex[hashBlockFrom]; + const CBlockIndex* pindexFrom = mapItem->second; nStakeModifierHeight = pindexFrom->nHeight; nStakeModifierTime = pindexFrom->GetBlockTime(); int64_t nStakeModifierSelectionInterval = GetStakeModifierSelectionInterval(); diff --git a/src/main.cpp b/src/main.cpp index bc9b6a6fbf..ebcf3fd061 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -3436,14 +3436,15 @@ bool ForceReorganizeToHash(uint256 NewHash) { CTxDB txdb; - if(!mapBlockIndex.count(NewHash)) + auto mapItem = mapBlockIndex.find(NewHash); + if(mapItem == mapBlockIndex.end()) return error("ForceReorganizeToHash: failed to find requested block in block index"); CBlockIndex* pindexCur = pindexBest; - CBlockIndex* pindexNew = mapBlockIndex[NewHash]; + CBlockIndex* pindexNew = mapItem->second; printf("\r\n** Force Reorganize **\r\n"); - printf(" Current best height %f hash %s\n",(double)pindexCur->nHeight,pindexCur->GetBlockHash().GetHex().c_str()); - printf(" Target height %f hash %s\n",(double)pindexNew->nHeight,pindexNew->GetBlockHash().GetHex().c_str()); + printf(" Current best height %i hash %s\n", pindexCur->nHeight,pindexCur->GetBlockHash().GetHex().c_str()); + printf(" Target height %i hash %s\n", pindexNew->nHeight,pindexNew->GetBlockHash().GetHex().c_str()); CBlock blockNew; if (!blockNew.ReadFromDisk(pindexNew)) @@ -5224,11 +5225,12 @@ StructCPID GetLifetimeCPID(const std::string& cpid, const std::string& sCalledFr if (fDebug10) printf("GetLifetimeCPID: trying %s\n",uHash.GetHex().c_str()); // Ensure that we have this block. - if (mapBlockIndex.count(uHash) == 0) + auto mapItem = mapBlockIndex.find(uHash); + if (mapItem == mapBlockIndex.end()) continue; // Ensure that the block is valid - CBlockIndex* pblockindex = mapBlockIndex[uHash]; + CBlockIndex* pblockindex = mapItem->second; if(pblockindex == NULL || pblockindex->IsInMainChain() == false || pblockindex->GetCPID() != cpid) @@ -8355,8 +8357,12 @@ CBlockIndex* GetHistoricalMagnitude(std::string cpid) if (!stCPID.BlockHash.empty()) { uint256 hash(stCPID.BlockHash); - if (mapBlockIndex.count(hash) == 0) return pindexGenesisBlock; - CBlockIndex* pblockindex = mapBlockIndex[hash]; + + auto mapItem = mapBlockIndex.find(hash); + if (mapItem == mapBlockIndex.end()) + return pindexGenesisBlock; + + CBlockIndex* pblockindex = mapItem->second; if(!pblockindex->pnext) printf("GetHistoricalMagnitude: WARNING index {%s %d} for cpid %s, " "has no next pointer (not n main chain)\n",pblockindex->GetBlockHash().GetHex().c_str(), diff --git a/src/wallet.cpp b/src/wallet.cpp index 926e6a4f60..aac1c108b2 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -463,7 +463,8 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn) wtx.nTimeSmart = wtx.nTimeReceived; if (wtxIn.hashBlock != 0) { - if (mapBlockIndex.count(wtxIn.hashBlock)) + auto mapItem = mapBlockIndex.find(wtxIn.hashBlock); + if (mapItem != mapBlockIndex.end()) { unsigned int latestNow = wtx.nTimeReceived; unsigned int latestEntry = 0; @@ -497,7 +498,7 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn) } } - unsigned int& blocktime = mapBlockIndex[wtxIn.hashBlock]->nTime; + unsigned int& blocktime = mapItem->second->nTime; wtx.nTimeSmart = std::max(latestEntry, std::min(blocktime, latestNow)); } else