From 1991c935a69a20073c6a6fa4cf53b8980fd20ddc Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 17:33:11 +0100 Subject: [PATCH 01/26] first script WIP --- benchmarking/benchmark.sh | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 benchmarking/benchmark.sh diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh new file mode 100644 index 00000000000..04502d5fd98 --- /dev/null +++ b/benchmarking/benchmark.sh @@ -0,0 +1,36 @@ +while getopts b:d: option +do +case "${option}" +in +b) branch=${OPTARG};; +d) dbdir=${OPTARG};; +esac +done + +if [ -n "$branch" ]; then + echo "Branch is $branch" +else + echo "Branch is master." + branch=master +fi + +if [ -n "$dbdir" ]; then + echo "DB dir is $dbdir" +else + echo "Using default DB dir." + dbdir="D:\\chains\\perftest_ropsten" +fi + +git checkout $branch + +srcdir="../src/Nethermind/Nethermind.PerfTest" +bindir="$srcdir/bin/Release/netcoreapp2.2" +echo "Source $srcdir" +echo "Binaries $bindir" +pushd $srcdir +sed -i -e "s/D\:\\chains\\perftest_ropsten/$dbdir/g" Program.cs +dotnet build -c Release +popd +pushd $bindir +dotnet Nethermind.PerfTest.dll +popd From 74bd3b0ee0d505d7a22024680918c94c3ed87afd Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 17:53:59 +0100 Subject: [PATCH 02/26] branch and dbdir --- benchmarking/benchmark.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index 04502d5fd98..415f981b77f 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -9,9 +9,9 @@ done if [ -n "$branch" ]; then echo "Branch is $branch" + git checkout $branch else - echo "Branch is master." - branch=master + echo "Exeuting on the current branch." fi if [ -n "$dbdir" ]; then @@ -21,15 +21,14 @@ else dbdir="D:\\chains\\perftest_ropsten" fi -git checkout $branch - srcdir="../src/Nethermind/Nethermind.PerfTest" bindir="$srcdir/bin/Release/netcoreapp2.2" echo "Source $srcdir" echo "Binaries $bindir" pushd $srcdir -sed -i -e "s/D\:\\chains\\perftest_ropsten/$dbdir/g" Program.cs +sed -i -e 's|D\:\\chains\\perftest_ropsten|'$dbdir'|g' Program.cs dotnet build -c Release +#git checkout -- Program.cs popd pushd $bindir dotnet Nethermind.PerfTest.dll From 2cf4519f9731fd8bf6b1ff1ffbb9aa4312bbf4a6 Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 17:55:01 +0100 Subject: [PATCH 03/26] revert after changing --- benchmarking/benchmark.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index 415f981b77f..920b1345200 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -28,7 +28,7 @@ echo "Binaries $bindir" pushd $srcdir sed -i -e 's|D\:\\chains\\perftest_ropsten|'$dbdir'|g' Program.cs dotnet build -c Release -#git checkout -- Program.cs +git checkout -- Program.cs popd pushd $bindir dotnet Nethermind.PerfTest.dll From 8c4760a650dbf494af12a886b69b6828bf220db0 Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 17:58:34 +0100 Subject: [PATCH 04/26] need to commit to run --- benchmarking/benchmark.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index 920b1345200..415f981b77f 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -28,7 +28,7 @@ echo "Binaries $bindir" pushd $srcdir sed -i -e 's|D\:\\chains\\perftest_ropsten|'$dbdir'|g' Program.cs dotnet build -c Release -git checkout -- Program.cs +#git checkout -- Program.cs popd pushd $bindir dotnet Nethermind.PerfTest.dll From 350364aff833aad35deb6faa22f6e62ec320f3bf Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 18:01:15 +0100 Subject: [PATCH 05/26] backtostartbranch --- benchmarking/benchmark.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index 415f981b77f..4defee4fe8b 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -7,6 +7,8 @@ d) dbdir=${OPTARG};; esac done +startbranch=`git branch | grep \* | cut -d ' ' -f2` + if [ -n "$branch" ]; then echo "Branch is $branch" git checkout $branch @@ -33,3 +35,4 @@ popd pushd $bindir dotnet Nethermind.PerfTest.dll popd +git checkout $startbranch From 142789325ddecf1aedc4252d74afa5015fd1605c Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 18:03:31 +0100 Subject: [PATCH 06/26] startbranch --- benchmarking/benchmark.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index 4defee4fe8b..7c1d1e2a0aa 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -30,9 +30,10 @@ echo "Binaries $bindir" pushd $srcdir sed -i -e 's|D\:\\chains\\perftest_ropsten|'$dbdir'|g' Program.cs dotnet build -c Release -#git checkout -- Program.cs +git checkout -- Program.cs +git checkout -- $startbranch popd pushd $bindir -dotnet Nethermind.PerfTest.dll +otnet Nethermind.PerfTest.dll popd -git checkout $startbranch + From 723c87d83c955d4322d983c7bc5d3c858c2191d4 Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 18:04:24 +0100 Subject: [PATCH 07/26] startbranch --- benchmarking/benchmark.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index 7c1d1e2a0aa..2fa0fd9e07c 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -31,7 +31,7 @@ pushd $srcdir sed -i -e 's|D\:\\chains\\perftest_ropsten|'$dbdir'|g' Program.cs dotnet build -c Release git checkout -- Program.cs -git checkout -- $startbranch +git checkout $startbranch popd pushd $bindir otnet Nethermind.PerfTest.dll From 32e2fbf511c8659f39bbb2ef5a3d86ada3a58de4 Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 18:05:59 +0100 Subject: [PATCH 08/26] startbranch --- benchmarking/benchmark.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index 2fa0fd9e07c..4cbe787f096 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -10,7 +10,7 @@ done startbranch=`git branch | grep \* | cut -d ' ' -f2` if [ -n "$branch" ]; then - echo "Branch is $branch" + echo "Trying to checkout branch $branch" git checkout $branch else echo "Exeuting on the current branch." @@ -31,9 +31,10 @@ pushd $srcdir sed -i -e 's|D\:\\chains\\perftest_ropsten|'$dbdir'|g' Program.cs dotnet build -c Release git checkout -- Program.cs +echo "Trying to chckout branch $startbranch" git checkout $startbranch popd pushd $bindir -otnet Nethermind.PerfTest.dll +dotnet Nethermind.PerfTest.dll popd From f4538753a8fe5c4d380fffd864427e2e23ddeee7 Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 18:08:16 +0100 Subject: [PATCH 09/26] cannor stat.. --- benchmarking/benchmark.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index 4cbe787f096..1ec17d64d6c 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -31,7 +31,7 @@ pushd $srcdir sed -i -e 's|D\:\\chains\\perftest_ropsten|'$dbdir'|g' Program.cs dotnet build -c Release git checkout -- Program.cs -echo "Trying to chckout branch $startbranch" +echo "Trying to checkout branch $startbranch" git checkout $startbranch popd pushd $bindir From e6af12b9400dff890bdab0078241e7c55d73a000 Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 18:11:31 +0100 Subject: [PATCH 10/26] prev branch --- benchmarking/benchmark.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index 1ec17d64d6c..f457a2a760e 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -7,7 +7,7 @@ d) dbdir=${OPTARG};; esac done -startbranch=`git branch | grep \* | cut -d ' ' -f2` +#startbranch=`git branch | grep \* | cut -d ' ' -f2` if [ -n "$branch" ]; then echo "Trying to checkout branch $branch" @@ -32,7 +32,7 @@ sed -i -e 's|D\:\\chains\\perftest_ropsten|'$dbdir'|g' Program.cs dotnet build -c Release git checkout -- Program.cs echo "Trying to checkout branch $startbranch" -git checkout $startbranch +git checkout - popd pushd $bindir dotnet Nethermind.PerfTest.dll From eee1fd9ead060c08849a2b27af69e33cd43ab540 Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 18:14:04 +0100 Subject: [PATCH 11/26] works? --- benchmarking/benchmark.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index f457a2a760e..a23e9023478 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -7,7 +7,7 @@ d) dbdir=${OPTARG};; esac done -#startbranch=`git branch | grep \* | cut -d ' ' -f2` +startbranch=`git branch | grep \* | cut -d ' ' -f2` if [ -n "$branch" ]; then echo "Trying to checkout branch $branch" @@ -23,7 +23,7 @@ else dbdir="D:\\chains\\perftest_ropsten" fi -srcdir="../src/Nethermind/Nethermind.PerfTest" +srcdir="src/Nethermind/Nethermind.PerfTest" bindir="$srcdir/bin/Release/netcoreapp2.2" echo "Source $srcdir" echo "Binaries $bindir" @@ -32,7 +32,7 @@ sed -i -e 's|D\:\\chains\\perftest_ropsten|'$dbdir'|g' Program.cs dotnet build -c Release git checkout -- Program.cs echo "Trying to checkout branch $startbranch" -git checkout - +git checkout $startbranch popd pushd $bindir dotnet Nethermind.PerfTest.dll From 448618753ccbb6dc8e4f420098c46ad623058200 Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 18:17:56 +0100 Subject: [PATCH 12/26] back to folder --- benchmarking/benchmark.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index a23e9023478..1ec17d64d6c 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -23,7 +23,7 @@ else dbdir="D:\\chains\\perftest_ropsten" fi -srcdir="src/Nethermind/Nethermind.PerfTest" +srcdir="../src/Nethermind/Nethermind.PerfTest" bindir="$srcdir/bin/Release/netcoreapp2.2" echo "Source $srcdir" echo "Binaries $bindir" From b9810f6a70df48bfeb764658ca8a4fcaf244e40e Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 18:59:34 +0100 Subject: [PATCH 13/26] mor elogging for linux --- src/Nethermind/Nethermind.PerfTest/Program.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Nethermind/Nethermind.PerfTest/Program.cs b/src/Nethermind/Nethermind.PerfTest/Program.cs index 68beff6162e..ac14e148c14 100644 --- a/src/Nethermind/Nethermind.PerfTest/Program.cs +++ b/src/Nethermind/Nethermind.PerfTest/Program.cs @@ -376,6 +376,7 @@ private static async Task RunRopstenBlocks() string path = Path.Combine(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"chainspec", "ropsten.json")); _logger.Info($"Loading ChainSpec from {path}"); ChainSpec chainSpec = loader.Load(File.ReadAllBytes(path)); + _logger.Info($"ChainSpec loaded"); foreach (KeyValuePair allocation in chainSpec.Allocations) { stateProvider.CreateAccount(allocation.Key, allocation.Value.Balance); @@ -385,8 +386,12 @@ private static async Task RunRopstenBlocks() stateProvider.UpdateCodeHash(allocation.Key, codeHash, specProvider.GenesisSpec); } } + + _logger.Info($"Allocations configured, committing..."); stateProvider.Commit(specProvider.GenesisSpec); + + _logger.Info($"Finalizing genesis..."); chainSpec.Genesis.Header.StateRoot = stateProvider.StateRoot; chainSpec.Genesis.Header.Hash = BlockHeader.CalculateHash(chainSpec.Genesis.Header); if (chainSpec.Genesis.Hash != new Keccak("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d")) @@ -399,6 +404,7 @@ private static async Task RunRopstenBlocks() throw new Exception("Unexpected genesis hash"); } + _logger.Info($"Starting benchmark processor..."); /* start processing */ BigInteger totalGas = BigInteger.Zero; Stopwatch stopwatch = new Stopwatch(); From a3f63169e9fce11f74df4f08662314c6f0101634 Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 19:39:09 +0100 Subject: [PATCH 14/26] check cache --- src/Nethermind/Nethermind.Store/PatriciaTree.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nethermind/Nethermind.Store/PatriciaTree.cs b/src/Nethermind/Nethermind.Store/PatriciaTree.cs index 5437c8888d2..6373990dd77 100644 --- a/src/Nethermind/Nethermind.Store/PatriciaTree.cs +++ b/src/Nethermind/Nethermind.Store/PatriciaTree.cs @@ -32,7 +32,7 @@ namespace Nethermind.Store [DebuggerDisplay("{RootHash}")] public class PatriciaTree { - private readonly LruCache NodeCache = new LruCache(64 * 1024); + private static readonly LruCache NodeCache = new LruCache(64 * 1024); // private static readonly LruCache ValueCache = new LruCache(128 * 1024); /// From 3352ae14a9887d36bc6dc22588aed30793db5b47 Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Sun, 7 Jul 2019 19:42:35 +0100 Subject: [PATCH 15/26] only dir if needed --- benchmarking/benchmark.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index 1ec17d64d6c..c74dad09ffb 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -16,19 +16,19 @@ else echo "Exeuting on the current branch." fi +srcdir="../src/Nethermind/Nethermind.PerfTest" +bindir="$srcdir/bin/Release/netcoreapp2.2" +echo "Source $srcdir" +echo "Binaries $bindir" +pushd $srcdir + if [ -n "$dbdir" ]; then echo "DB dir is $dbdir" + sed -i -e 's|D\:\\chains\\perftest_ropsten|'$dbdir'|g' Program.cs else echo "Using default DB dir." - dbdir="D:\\chains\\perftest_ropsten" fi -srcdir="../src/Nethermind/Nethermind.PerfTest" -bindir="$srcdir/bin/Release/netcoreapp2.2" -echo "Source $srcdir" -echo "Binaries $bindir" -pushd $srcdir -sed -i -e 's|D\:\\chains\\perftest_ropsten|'$dbdir'|g' Program.cs dotnet build -c Release git checkout -- Program.cs echo "Trying to checkout branch $startbranch" From 07f8c1ebd0a5eb1c7d210622e192f9eab189c75b Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Mon, 8 Jul 2019 01:46:48 +0100 Subject: [PATCH 16/26] A script to run ropsten100k benchmarks on a list of commits --- benchmarking/benchmark.sh | 4 + benchmarking/commits.list | 935 ++++++++++++++++++++++++++++++++++++++ benchmarking/repeat.sh | 18 + 3 files changed, 957 insertions(+) create mode 100644 benchmarking/commits.list create mode 100644 benchmarking/repeat.sh diff --git a/benchmarking/benchmark.sh b/benchmarking/benchmark.sh index c74dad09ffb..3100bdfb2c6 100644 --- a/benchmarking/benchmark.sh +++ b/benchmarking/benchmark.sh @@ -13,6 +13,7 @@ if [ -n "$branch" ]; then echo "Trying to checkout branch $branch" git checkout $branch else + branch=$startbranch echo "Exeuting on the current branch." fi @@ -29,6 +30,8 @@ else echo "Using default DB dir." fi +sed -i -e 's|Console.ReadLine();||g' Program.cs + dotnet build -c Release git checkout -- Program.cs echo "Trying to checkout branch $startbranch" @@ -38,3 +41,4 @@ pushd $bindir dotnet Nethermind.PerfTest.dll popd +echo "Benchmark for $branch complete" diff --git a/benchmarking/commits.list b/benchmarking/commits.list new file mode 100644 index 00000000000..b31c36da14a --- /dev/null +++ b/benchmarking/commits.list @@ -0,0 +1,935 @@ +ece5f8ef6b8d03101fe2ea4992431099658305e2 +f6751c15a26c860b8bc856ec0c77fe5d28aa271f +634da4955c2e31e6fe2c9cc367f9c7f77c527bc2 +d1d7117bd2a845fac0dbe9af9427d43a1bfe209e +b938faf6b40cd0c5be30dda68609213c063ac32d +b21109a402a9b530f29d8389475afe7f21d01886 +0abffe56dd741f123f141a41d3aa91f00d1f91cd +fd7cea99136bf30ad3585cd29db2e664f4730a48 +54d2952649a70bb6080eaadc4de4ddca1d4b9d7e +055c3eb3988ec9712f34b796d70b0e911d724252 +07c1aeebb2c0f9f551b944041e5ac87d639d443f +9fb9b0667827deaa476152c9dc9417665bb8f1f0 +7d151a24d8c3fe0775977bc2a4c96876c3a470ce +7c88deca91cf691796ed2a746f67b46a83e4dae9 +9bd352c99e3a391a5120556df3e8e7460b330ba3 +34d4187e5fd7dc14b840c49f0f482a335591225a +70ea441e69386509cd90ca314a091e3d6b1565a3 +773bdcde0120c3cddff4d4c12dbedef376445eca +5cb8ec7ea7bb0328d7a4f012dc30df62c263b915 +f6eda10a34c4c02846ed9576e4f377b9bf2e30b0 +6865703ba9718f6da920de78c117300eed2744ec +065464462f3baef53771b8b9aa1c4bcc5b89ff26 +7046d281e7be074c3736b96fdb91c6d9801db74c +1869a173d4c1b5b457d69cc1ea5a5a03591884c0 +183ea727b51a5a12574c28d972c61f79215c59a6 +779c827eb2740b6145a6304be7a5923acfe69faa +d1396dbb5b2472e5f6eac8521da85dd02d80e34e +1c19e5bb437ef58168c87ab755da00f1926d5b99 +6ace680178d118c5de7e2ca9dbcfbd776afee930 +4b7a82021277655ab6f57b294fd42c2fe793dfba +d72a55beb2ea91cd579b9b2db50875385d0b6fb7 +84c75af46ee8ddedd27303417875055119732356 +f53cc7dba6cd7c35b5c2690b8ba6671e77e18519 +8170db3eb360517e3288611cff0ce031b7cd839a +18d0ebbe0c61b70ead835765938ad7581c1dadfe +2ae83caa8a4e2b2e6f11ee37badd14d23a6740b4 +359995eb4721fb24b506984c32a1306b85bab883 +964b8fe73d734e776fbcffd27d397e6909417056 +f3c8ed74d57f0a9b049dec1e1fd3c2e771b2f415 +ea309cd61f9c070e971a566b921aa10828b5982c +e82d388dbfd0ed532fb15a3c2339368d02e179c2 +86b9a91e4ec684fa2642ff4033925eca1ffa0f1c +8fb0406c42be88e5228d3ade0634db2cf3db093b +527a4caaabe63dea3e1a9bcbce9ec2b76f2d18f4 +27c19180a2c790fca0ef55bdfee6fd44deb95a7e +cd1a6441731238dc759bad9899693e76f984e164 +940a608883dcce1cf50b34dbed50cc2114df941c +fdbc13fda3ca1693e1dc6cad7ee55a454a6c1edc +d44bf226ef8167c6e7e9d8a13d05d3ed51e9c39d +bd7b8d7364d8c8dde2fd0299b061217eea10f36a +92d699f59d232cdacb1ed20078f10d88bdbd6ccc +c1f279b5bbd574c65c363668c4552b158c8e407d +52ca366f3385f4701fd59ccc72178dcc176d25c6 +3caeb4d494ec455d123eb9ff7465de1100cdc704 +1b9619706636ba3795e8d6795c5493b127295ccb +6e809f7f3004b940ace8bdddd98966331baec39c +a5435ced4e66cd506864c3a51e54f5e31c64252a +031c735187168835aaf8f12fbab8875180376cb6 +5c78ce8805bb861d87e4543aa51e59bb7b57cacb +efe4511199fa67f8e412a9b7c4fe1b09db1dcc25 +6d0a64699378fcd459a18344227d6e0b1fc94d81 +ad32ef8a9dd6c97beff82698d5b3e32972946535 +f49e1f7adffb1befe669d39f8e344d030ff4e4b2 +0791a540bb730d396413967087a33fe60b5a0195 +0d20aee6cdc661081419b75e697ac4f02e25f251 +87beeff02cc2f4c680e809718e4e6dc064912053 +4c1894122d26df676c766ba11cda1424c81e508e +a1a164a23f35a706363082c7f03c43a6924b5d84 +d863993f7ce2e835bf11fa114e9f89b51b8ddb04 +5e98f8d4eb87d907b4a7fc3a510d09ac2e5e29c0 +72312c2fd87532292418d805854b21d790b8334d +d102799e42c076fc276917a9830a4cb23b94fb0e +e3164439ba55738a58d861b9fd0b55801c7371f0 +156f97280a08817eeae62f915a5a17f716335594 +dfb2d410d0ee798d2e26e31ed9c1e5dde76cb388 +8e94139832474f6e99d6e0a2c7a7f96a88e463d6 +f06e7a5eea86dcba0e81bb5e2a5441e3aa27ee72 +89e318bf255ada6b8c7671e792cc47580f41c996 +3b3472de9ffaf4eceee223692eb43617f0f4160e +fca8e375b1c2be51c5f32b6ea7a133c37e82cbe4 +686435c4882f58da84e4b813c5d11650df7cb7a4 +47be76b1577dc1377f46f63935f44a5839142c4e +5dceb4d0496d93d5b1f669275acce67524580452 +a3ab17063dbca79625a6d14b8a2c4cdc182f6eeb +c59e68d84debd4d7e2e4471aeebc6c70bf461a09 +560d17f451157e19a695f63c259c1980ac793cfc +ad275fcd4b4bc5fd416f28821e13fb16724552ea +bdaae1c7fa6d28cfe7748aa0457bbae390736917 +78a00e58b8e3bf12b83d05cc5a97cd993189cdd2 +92cb7f8294ac7616018cfd53e8cad7d6cf4364f6 +962e9fb834179a243284c3e2cd029eeb03134185 +9120fb1964f35d7ef19ef134cdeb85a4b3fc5fc7 +0af25cad9a650afcfc4b0b752140d03707a0bd3d +f80da4b3face237024fb12c0c83edd3e422299e7 +a478b9b3ff4e6d91a26e7b974d2afed688e5c21c +564b325908dca191b1918da5854ba5bc76a5976d +f7f87770ce197a06424d0a6efa3c4f17809b4895 +11fa5ca9a7ea6f95f3b8ac8676dd346a389dedce +3517ad3c3953b43127c55f40f91b0caa758f4d2f +8b096c019439f8a98334b29082f2c9714c083764 +3ca24a3144c7e458e30c03e3e39e6b70a986e53e +dfb58e1ed3495ef9633f75b6facb407404159339 +4afeb9e39d89c43356be57717a3cc0cca309a89a +b5b38016b3bcf02d00fab55c593a9bcf80a2269a +260a88e7f42c938083d328c01a1b8a821cc4b52a +ca54c5741ac34a09a3b1bcf564d2dd98d688c52c +9eaf7c853b959f18d60f8a7e587ca10dc29746f8 +9d2792f0498bdc47cbf03f844f9eddfc7d68de4f +735c05490c3764a19315b13de8957f9c62b2d233 +470837565bae46f6adaa5a749c3b1f27d58ba51e +954a2b1d57cf1b8c1e12369bdef540f2e5c7315f +320426e33bc922f52b391a656c2a1efffa1c0203 +6d86f948d5272e0aed541bf163a24c741e9c7d70 +e2c4ccd8a72e0cefd7be6c4ed76bc681b82b5f94 +d51b7044815dc8534e444f2a00dc1220e3785087 +26551fe593173b98d81045958aaafb5bf0ffdec1 +2c4b7cd2d5d91549b3528c9b631229ac133ea256 +6d982f844eb25e1a2fe5d2e65608eb7b070575df +9202c41f9d9860f9c19cb94110bb45537162fafa +c48e3c67e480da2c29e8e3aff68c123c14f0e9c9 +baea59ce50ab751bf6aea79ea1a06be5e260051e +d3951f4b4bf6eac5a03ff4a9c699862156ed22b2 +091269774da36d561409f3b6572edc55ef2f69a4 +8f6d5c0fe07fd10c51f8f57818f4e98955018ad5 +29b504c20eff4a818899b7f1264997bbbae77639 +6964143b60b3d3e9cac2fb74e3b5399291a34d64 +167b977007c2b155842b9ac306ade5492078778a +6f4c44581e5dea086f150aa74a9709a2968dc6e3 +fb76b8009ed6552022d080fc15f3eecd5ac6aa51 +6073b1344c19d9a6e9019872b4d5ebe737cd055f +ba0edad3214c4c83a7d9b299a7b9711d7d408fec +4837a50d44589ddd323762f6557c4d0e4d842e6c +c8c4a564a46fd202a2f41b1fe441ead26b44457f +d4aea522ea89a6e82024d22f9f63fd524df8fb2b +d75161f635fd9c588cfc870dd77da165f61d7631 +f8f65ec77adfdaed4da347644f3854a6fba2add4 +8315cc36e8d099e5a6c0ce62094aa75beeaad92f +81668de7c183de89df09be762bb0c5c4739ee0dc +7d5e262ea21b2b46f49865068bdafea59f9c5085 +a2f6d16c8e0ab4f27b6647f93f326ed9c60fdf64 +07ec8c34569b737f4bdd35d1f329289b126c6256 +fdd974d945176ae9a277d55e3b5d45efa7c4f418 +672770b8843194f0950972408bd8e058d0384939 +044f822489b63fafd5e3c8538320077ea88ae0cd +db61a733dc5f1704465ad8e7ef8e5af0904bc6a6 +16c0571f53557d3ae52344e2b61e446d8952eeaa +8cb2bdbaa43fe8c7651e18e086189bce4b908875 +b019e87d3ffc3188950b8af6eb910e0bf9961879 +7bb1e10ea3787030e6c57158e042d5c0b6adacb9 +f7f917fc8daab7dc01496c51c987bbc7759b0efc +10825125cf8b47b23b301e70dce4e807bff0fffb +528b836f329c7103913c5b330b3a9f7c86cf7112 +cf1b4a3926f4d6478eda39f88a775cf2703a5266 +cbd3286c52a9751b38406c8362433c8b5334cc93 +14cbb9c5379fe1331f0b6347d87685966246bc96 +3f91885ca2149f85dac3ed80609593a243833137 +1d6559207b38e1095958a376b8f83895c32a5458 +dace0808222e62da0d4ffa1a606f47e75f452d9e +ae980b3391b9deb893ac4318a169e0f0b44fb5c5 +03177463b222dba23797194375a65fb8ef40f4f2 +6f83eb77265afce9b04d28a385280721615196ba +dbb3d39fe370df6928c8768f85078ec7368753be +57030ea336d86fa04648da83b0fdab6dc70c844d +65d3a5ad66a04e670ef7514741aea247af0e6f23 +0977bfd92dbc05bd415726c2a31f82518f211843 +8ad7693881023acb0dc2530190f775795a59e97c +da417e0bf33737ddc5a4729798bad95f1c5fed72 +6f9e0f186040d05f413a4271e0b15e529caffce5 +4d019256b84217f7b525a8ac32f7b114497c0f7d +803a79fef48e38bf1f057436a6de2de2818256fa +2fdf373e0ba388e4943a0f133845912fc7d613a8 +8491cd302db2bb8ed8c68398adf7a038052ef210 +57b46ec55ba1bb6df62088e4333252b5e548f643 +a55eb6f3bcdb3e1717c267dd4c4dd16d53ab5b24 +cfaa7d29b3f695df5da141615845eb50f03e7b44 +59b7cb616620c0de2485ae60bd88fc33f5e2e780 +50268b2cb5613a12c1432932fb874ed818f414e7 +f021096a7d859af02fb61cdd99e3e6b877e2ffb5 +263b365e4239780b325a57c9c182128b53023e33 +d43b0bd7d4430b8b6d32b700fe18795f3090938b +00e81e963c599ab5b4790f25c81e4076712b939c +33593b659494ed55c3d3c4e9c93c0c82db7748d9 +71397157fa72c00c458db20a3967b60a59cf96d5 +12e0e54f7060184ae0f45300bdf8743dcd1e696e +76c2416ed03fc02d1a746c184208819c8485ae55 +94975116a50a7decf0fe88ec8d618d1ec0b39b66 +a226852b5bf1f703a805c1b3fce2045c13fd68cd +403e72937adb52e0f373f913763849470a944b10 +793d9dc1d735ff1487b2c46d475c5e631c72a8cf +e51d20b3e1fc90b413e590f44b3c2486e0a8de92 +fb3ef89e31e1ccbf3382bd978127e55bf4825739 +8ce4a0478b36dc79b07e20b1e53e682ff2ca51b0 +10515bd49f276a7fbfc292c0ae87578dfc26a592 +2b735f9c95a2660e03b6cf584947ee892dae400c +61d5b2c5efdf085b1f67cf2d77aa65b0273eaf23 +876ada13b7cca77ed69c9f451356f901e92b8689 +28070d49957196a1adef354b820a817153afe9be +062bd0156142e78afd7381b2f13f7ce57b3f2af2 +166b7f46341ec2cb383c5577e6136e64dee1bf60 +36b5a524a4a0d3111edfbe977666c5fc54774606 +addd818a1f92eb3c652c98bfbb5a1d9c1bb92ed3 +d7a4c18d619510fae39969ca75a53786b57f6420 +101ea3e8c634daef5977cadc8eb00448a9c3ca70 +e5fb1e709530a5efc3aaf34039a69e84f07241f4 +6f891a8bbd9a39f2ef1ecf9c51f5e1f9ef7d06af +3b59ceecb9a35f13bd1833795d880a7521d48336 +770a7c9ce7e9e8427e71ad825ddbf1e5b84eee55 +f2938ba3030c64010dd8a3061aed2cab1103b62e +02f59c2ad14996a154043f96d4a540c77cc9dc4e +93eb3c3efd5c08bd5fd41c7231288d82acf22ce7 +1955bc9372a32c5ce6b80651ac0e24a8b697602a +d386f304aaaf1544261915d80f44114f465b61b0 +fcd583c7672128fe4b800e2200f2cfbc42e7c9bb +b6d295298612b4484eec0280435aff83b1cddfda +22652d9cd14555509c2fd7ec316f7b5221f5b700 +be39abbafad9248b104cfc9be369b89cf441d884 +961fce1dd373b095bdea2e8e71a6c649b0e1712b +cb9ffa597eedfefc7876dc443a526a2eb81eff0a +56f570f4ae6098c1eaa3354114ed02033b545552 +d19e16bb5291b93856d454f06afab59cf518a60e +441c8eabde6f5fad376aeee1ddcb53bb3ae8c8c4 +034ec5fd4ce1fe910b923b82cb687bf79d1d973c +3a1a4a1d8c4e40043b8fcbc8e1360823f56c0e82 +1cd350323da85310850bbf130624d2e33d00a7a9 +ee28e83c48d158230600f4853a6735c6d97ece73 +20dc77cddc7b5be1e5f1c4f67d98e0bdf4545cfa +0e319bb5afb7c979f217bc96d4130613afad8d59 +c32f8bc4b6cfc2e093f92e8aecb8fca99cff6134 +75d65fb77c6adede5b99a815ff1bf8c8658860b8 +fecfd9ede717dd7bc4c0dc499f5599d318f8a611 +023d00f51a13e78edabae2e673ad78e1e7ea4533 +47be6ab3108aa224819c6b64fb0b0b322322ec67 +b6a2f35657763049aa542863f19eb772855f6e90 +e83c747393ec6a241af90bfdab77e8259cca4484 +77ca59ed6cca5678d6cfb642a8cf18cc19429ac8 +e77f0ec818fa319819a2cdb1eb13076df314c604 +1a075d94dbccebc12d63090220e933af50b123fb +385002b9482ab3dad8606c3202b8cc23fdedf45e +c1ae1c668e45b520ca4e76d7db58e66a4f84902e +d407a360c98d227144f3a72f6987aa4844200cbe +212e1b0211b996207cfc69c2b93aff88c419c814 +4b3df26c300a05072abffe6be4d34519b784d3d6 +5b1c9283e704c2867fc02d1d5c61f43da6feb240 +8c601db9f253cbed174e9dc30d6af865ff05e37b +fca071920f8079b30f4ce9e1dedb46d6412badb2 +53d430dcb1da5503eaf27a7629246b5a3572f0f4 +38cfa9c55e5a1dfd18a76de405587f6dc7e3b210 +b10a82bb5b82bd630ea8d1d5751f308849511e15 +14b777182fcd7a55d98126ad96cf3e57eedbb6b0 +7a619ae961020226582ef2e171f7fa47b88144a6 +cba1d3d526c0a7dbe08cace0ebdfc1f08d6b79eb +ba3e42704c1f8142cd5e0bcc9849777ba5c65d75 +8070b6df075ce3468eb35d434decb4ca0f2faaf4 +61bdcb9d77cb5e002d412c8a0430978bb7b81213 +65b3e3bf570fd2e0ea40e11a1ed46edd6e519e34 +ca767fdd01e69bca99eaa1d7695a5f0dbfbebfc4 +a474d9dc602a2e137a9704fc80366ae8de937ecd +b5755d61784dd406168970dbcbb2796e15e2c5d0 +0a6b9a0ef74a087ff9d03f34e00d74c88664d3ae +b7a19179738dac616896509d167a19ed066fef99 +8b09ea04a602b45be4460e2670d8e10dbb0dcca8 +988392cc766dd424c8c9bb0435df2ca6bf263094 +341b1f8587018667e54d550a0fd1aae852030633 +f567b2a17fb88609b54b9e1207db5af6322a7a3c +6e174b966a34144169454d8bf65c2f9a3a6fd931 +b0fe283aa5379e90749e5920c01d9a42922cf6c5 +17ddba1c78874b72f17065f8d551baad4ebf8deb +6bfea98e828e749c58b937e24480dfa4b2b54349 +553f0c3b446fd9082a5b297b319f882b956a9237 +0f35ddeee7afa171ffe05434bd469b57bc67b1b8 +8d0dcf66de03a9affab1294b1206944dea3a3e8c +1feea44f84cf1c867c112fb04a39a525858d04ff +051b89617e6386ad0ef872b0636500fa22448dd7 +7ab17de6375e5f4b96373d1769513bb3b523a416 +3e499e89b473fbf0210fc8a32dbb55e31e5b0e6f +53c8eb89827514cb53a081e0bfb0cdce068f4f5b +a9360835a0de1293bda06c8b0def42aa7545ef8e +2c65e1a26ea0653e1d900f397ff81f8b7920a1e7 +913bcdbff80b69c177880e3dce496f2104141df1 +2d474993e22794f41ad070fae082cec3e04f1fd2 +c67c51caf1ea202dc4dd7cb7a4901084ad8ef827 +fa1d7823e7c5d153746bf0ad4c5b288079f952ac +0b6737325ee593dd2494a6adc31bc6dd701d655a +e053416f8c4dfc13026e57443e2896614b70c5e9 +abc80679467f5ca248a0aed8c057b5f2c010865d +4896431336489ddafdec41b620a7f9ce686b3315 +7cca1f3e49a2ca1bf84f0331151190dea6415951 +f4407bd80a6706512b6cf1eb8730650494cbd57c +323274831f8e4fbbde5fbdd8ca16409e78973742 +c78b20d3eddce64eb1093ce0d3763fb2dfd9ac24 +469215dc957b707b91d19bd118fadd061afb4d3b +82145924d6e112c6f17fac061f8ea8866d231c56 +b2bc90fc91e5b453b40535df57f08592dc969bef +c71d2ff88bcf4b08724c75a6a29fed58af71f4a8 +f36a52dab6028a3623a250a9732ba794073cd9a2 +f2afc77d0466afdb1d19e5b234cd3bdad8e9c581 +afd65fb28a2b24945b955d25cc106e5d219b0286 +7cde2450386b682d647ddc729febb8679e72b31d +7a023b5b1c82aab060e63f20673b9e05774f47f9 +e36a281c1349bf6bb86810a878498fa0c3e1468e +06958683f9b2d4d92ba19fbef9cb9a2193d904a3 +2ce09c69110fc866933c8d47cbf9e363c0320183 +13bdee7260ce360b5d5a8ca55775ff29624933e5 +ed1bba677f69213c34137cdcfd37e6b290d24681 +20deee453f0a14c0f3959f7acd24973d940c68c8 +1ff7647721353a9c9d643551f1b7cc606fd10acd +156acba01f5cea62c2ff5f646a09ff819fbab3b1 +6b7ccac3ce97d550628d759bf272fcd490677d59 +4ec5236a7c4224e7c8edb1a805666735e2b17653 +5dcfe24ee9b9e16baecf10be7ae31381c3112eb4 +85ebc18d6ca09afbc33bcd6d529ebeb537582693 +76ce3189e67a69a2029c3a2014c43cf4320df536 +09878dd7ca7aafab235ade8c18e11b4bfe4661f3 +7210a86d674f60b7dca97f258ba3e66e4ca652ef +9948732fdc6dcea46304015e61f3450775e14c17 +f363d403ce56e13c96b5e442fed68544d9bbbed8 +c28f17d4b72e401db511cb6ba2187a9e52659492 +a484af2fbcb04318cc78429ff7640b1953320f71 +a26c8918ad7c8b579d87a2170efa66705f74affc +182dd49488bd65dcdd0def647aa2633c159b99b8 +ef868692a8bc5bdf2d3db1b10e8442df44d3e5cb +6c88b6a61f4dbf43cab5c6823d0b3d1f3559aa59 +23d79934882849d2cb8b2b5d29836ad09d6e7408 +884b5994953776f54d05ae09e8fb885cded21fec +d38a9525dbe55fd5afa606bc61acbf76cec8b70f +b6e542075abbe39434fbf805e878d8042a772b3e +b8d85f7d9421d4f4b3435adc7c621fdf763af178 +54a011923882d2026c228de9dcaee1e7b375c5dc +30d6652c2ac0e329ca16dbee0d53da44c99b2320 +d24a31c3e4c1ce0ab983f8275af720fc808ce9b8 +a39d9f67f8aaa9c12490fa0cdb5934864fdb91b1 +0b9edb983b55a31f55c3f8b7951f6d03f3a16cb6 +253f59b20d036ffd1d86e07894ceab4e75282c04 +84538a09c6e0edff2fd1c7a097b36a1533f163f5 +c3effd925ac265953efce69fe726e13e742afa2c +0e2697d4d158ec3d77d3b5fbf571a3ba1fd4389a +dd96e2a29ee1eb5d921911a03a70c0a81cdae032 +6e0d9b62590c8fd9a1c3a8b8da8e8bf3a814012f +31ffd6793ac236e9d4ced9e96279ee7f415fcd7d +b98ed51ad264509d9bd7f7923aeaebafa3ca1772 +467c00ef5e52a28f31868f9b5eee4ba579be3bb3 +c6c51ee13a014f52db196cb6904e8710778db3c3 +03943743e4bfc33172f54045d7c0cd57d3898c9c +a714153b54b4da77081ec7faee0462fb2ea601a5 +42802cd91ddbe9e1c551c5481576e8cfa3936512 +3b91a91eee969105cba5c6fbf3e12b4a24c2473e +088a00bef31137c1fe5d4d6da35135ff7fd624ef +3efd08c6541eb1c138c477c398999092d3612935 +db6973119618a9ea1b3978499511503f119392b7 +d7ae7e15506d9c72b678a8fde8c174acbad2b0b1 +c3884e60c1a76281baa81a5ad45a50c2eb9dc727 +7e094e9f239b1b854819642fa32e9fd49b2046c4 +633e1ce87cfa8966ddc7af8c6673a63a7a1257c5 +420192fb9ac99b63312136a115f5acc47ba2df86 +1c8441000f8a85cddf306a4b6cbc5e8d420f21cf +120e7c821c16f67232ceb4fb549987beea2fadfc +e196067eef32dfd37c7747f40a3f40416dd99c48 +177774ee0a68c30357c6d847314ded768e36f835 +0161c5d2f0fc279c09fb92ee4986624c0a1eb804 +ba6690d80b2a5de59504065156607debaa1c52b4 +a5ed8aaf0869d41291dee3e5ce081edfdd0f51e9 +39ed466c7e48a0ac016ebc3f454115c301e0e002 +21859df4bc4c9fa1995eea5b4dfe82502eecdf8e +893dfeb770f93a3da1daff4e126b73854448510f +4951cd21c92c7ce37e58f7ce36d7a60d6db3315e +ae72dd7594f313b4cbda8bce1bd5deb95eeadb2f +2a7130dd33035606abee689bcc4924c71f95b0df +894cf3aeb37e36792389d86e5a08115e3d7dbdb1 +40bbd8a8130fb058c146971230cbc0680210c5a7 +b918450e313e4ec49f4daa12af3a4da8b732f171 +ae7e43cb8f49ba861acf2c1fc3e619be7ab5c698 +7fef3d6b547bf7552922b427a5cf611ea7ba0c8c +0dc6b7722a71eb3bdd3ed854da53d28f62ec6273 +87cb9c1eecbc2580d89e4500722657d568516853 +a0f986894591f9d90e483b19647ffec29310e77a +aefffffb74c50825a679d716be9d93cf05ddfec1 +977fa2c5ee0c61e23c425d548edf0bc234cfc9c9 +b7faa7645334c471ce9ebd735261b3977467bd9c +846f98a5d2f0ac12cb7000e7533e6fc4f84344b2 +934440f4e2cf2ddd230c0c9e043a457139a75175 +447aff5ba4f56678c034e5042bdbf399e755f0fe +ba9eeba4452fff5a536e497bd4cfc14f099dc64a +eecff092520739649f6ffa579f8a72588d30c6a5 +baa1266bb690ecfaedb087dfa77e37b56f3aa093 +82a839f73b224d5e70a50ff64da06647c8f24def +d8fa52a3f2f88eca02b60676a5e4179ea36c8417 +49194120b9a140f3304743b767c860892520d346 +76a047fd7280c16895d0b4bb19e0f0668d0a57ff +2cbea31c6094d1e212e1a95ccf232a8ffea1dd50 +352a9014e393489e0a9b7ba9c2a9a2a5e626863a +d052d3bca789b20435dfda35e52fad113ac81759 +e268aa918150e92b305c1f61dc336557c271fcf2 +90b1e4a611d56019566b39e5fdc71c1486495d28 +7314c311dc5b890ae45495d72794f486caabc27a +a7a2123ee8de3db0d3e0ee0f582e497ebdd3e8d3 +389043454f1eefb0e068b5384eff50159717b946 +b13e04bc5a37261027129a481ad7bed190576494 +65bc3970543911c7aaa001fcadaf35cd2ae97e56 +6cf9f8ebfa68e974195dbb73e3a6d5d8c6e46c5f +536cc0317faeb6a900c9f8041cce6c966d312291 +e906ef4433a90a62d2417a867798df670cce89bd +435c60fa1084b55ea9cdca8620b99126bc41a9e4 +759e624ada98170a73b4d4e825bc63cf63d58100 +2d7265b77e52490266bf0eda32c5faeb82a9237f +5b7c3f731361fbbcaa17199c02d8d5766b66e199 +b2552e364ec8c591ef3845c21a2ff5d2fdd94e9b +b1dafe29d9741aac4cb6467d25e06a8ed7438f04 +41c83b424ac9027b44847a94983a4abb2e465801 +9e98554ce40d7ae5dbd093d4c86bfdef8fc3df48 +ecac7650a0add9c702454d1a5e1dce8649edc6a9 +c46e510c9ada6de8dc435581264fceb2d57a0628 +d1fe13448776063c5624afbc60d59983c4074b33 +2e94fa11d75027a23c894f953b32c929dec56656 +68f2c04be08b9f878e6d8d31bce65d1abfaa0252 +5a60ea4f9c4f1b97e3ddb264bc2337b87ce5e025 +8e2b24c3fbf4b4ee19e850465588a03b460fc853 +0adf5b91d14b59717e9b05ace0a471763f406279 +16fef90d8e903916702f22b2d991ead29fffd388 +dc2e2471892cc93e7607a2d432ff8349e53ff7f1 +53ad0b539bf0642c219478d88c232204e889c1ab +ad56afc9a9e498a641873fa0059e1d471762ec4b +5989b972332a4770194e2db2c57cfd71833f87ef +12bfb073ff3512e28d23f5da9abc976400465cab +fc35383c62a9e22cc7dc72ff5e6f92f448c04125 +4f64f557adc02277a723d12ac141367165c091c5 +ad0725594f973dee819c80bc38cbc3359b1e36f5 +86acca53ea735647f9f4eed914e8f5f28c96cd88 +846c4a7470f260cdf95befb1ab07dd011c08e4cf +ae83a9cd5b7e8e2a5b6cf379652d404fc5305bd3 +d35c9be73cc237a9bf09964b3d6cfe397b43f26d +ca380ff6edf40634f1ee3ba13056a659ec202ed6 +02f88a516ce4d111e0e18b73ffc4ddb00355eea2 +add85b8e26bbe342ce72206c78e70fe41b2710f3 +aaca08499a785e002cfe92db595690aa9701960c +0963f83fb0dd2b48e269559756bd8f41e4f6b993 +570229d954bc570cdd9ddf005571ae7cd6168f46 +7bc3e791ce53a9e96453763cba7fd475c3d5ff47 +3cc7cf98a75da3315f5ed38f9c8d1309c2b10f5f +cb2127967ba8aac908ee1bf67cece95cb4bc4c3e +ac9863513151440ce4e98537d88e3f43530468b4 +edfad35a556d14146a74b81d94f154626abb921d +a39fc65bcf6e1c6647ea128afbbe63c705de23d0 +4541dd1b8c4e171bc5ab9d072c5d1e03d12ea4c3 +d90024d4cf6cd57fe48597f73d64716522036691 +008f0ffcc0606e2909bc2579b16a53a3cf48227b +bf994add022a8a3c38c7551d3dca4cb04eaa4aa1 +60d19da0a087899b823a8273e42b389e64ef3d07 +a741e1dd12dd87721994ddba5c84ccdbfd559255 +3839b0eb45816f6dabdd5a446565c8314a3d2bf1 +ac1b7d5bcff6aaad7c80e42ae741090d3239bbd7 +924567aebd58329ff0f118cd2925f30b12d124b7 +022de224e729cf375c1f7c8df3b6adeffb799fe0 +3922d4a3da1adc61b5cbdc7b0c90f914f8fcbb7b +75c06936d4ccf27dfc95ee8e05574f085e97085a +7205f816c6de5168f44be9f90653b35f1a3bed67 +89172eddf9403e2e77e7bf0205916b44d1c289c0 +70d8fd86f101e0124d9c28d96959c2eb81956124 +37f90d72da9dd934dd990ded84ad390ba399064f +ff49bf1846688aafead4cd50b7d9206366c094ee +37cbd6d12822763feaae4c881c095de24c8b2462 +3741095826e0c04f42f62e0e930bf2ed3980d46d +125aa9c1983b9ed241fa485d85c7e69c9ffb8db6 +f219ff6e3a60287119b5f930811c32afce80b4c3 +a5a071085f1ab589ab0ff7e5d751b9dd91ba54f7 +c94032c7b7c945bf0ebe6af5c238f33d2f8442c1 +4426556389f60c1d7755c45c17ef19850b840581 +ff5df51c49282d547bdb483110200c37036c8146 +2c97c729b98d93524d51caf940fdde011209d1ba +6fc1541a29118e4b4697b3f9a62b221593ed96b0 +6b45cea3e2f2b9c3e5b026e739b638345610b605 +7a6529244eb7121013c5528524f9066419125cbc +3a114657ca733a229d50eecfad6600bf96b928b1 +6a0e5a94d07f45ddcec18ef0a25241d115368ed7 +24585ccee52704408f4f6aa659930808f1fbd41d +a412d8cb5b226fbd0e19178b7daeea7a467ee211 +b58e879615a0bc10469e5f4f56a7066a3491822f +f9103dd2e5344ad25caa9d747bc31134d85cff4b +685a7d319dacd1a58136aa4dadf197d160dc6472 +83cc04bf59c82e717ad43b3fbde2de698d9eae26 +7ba3351b35f0ce6b44e4af077e532e2c9147361a +f097ac7158dfd98f0106ac27b13bf3df09007437 +c5dab5e30edc7f9d1fb417a9fb07a448be41daed +d7eb81d2a1393ab794646b2fadb3016007d739aa +3a4d641f9188737efc139c93bed50ea40eccdbb9 +6e0b5ca8a1614dc9e0553401d7968dd36c730162 +eef19c8eb24e4e0065c5d12dc27e1ddcd7d560d6 +3485de25a691eb716ab34c634108165c9310ac00 +daafb497356d47c1b12d9c730aaf50f22292befd +2fa0e75e701f4b790691f6ff81c7c0d31dc64154 +e18eb84ee2914ed4247368db7d37721e63e100f5 +3bebf1a68b87dbde526c952fb110d92fb0ae5676 +7f8adf6b1cdb83ddc00813cf8c8cf694ea11c728 +03186da058749d723e8f578db0eb15707038ef68 +9c8175d54a7e81abc8c41c349ef676ea8d24d28b +45db9785871aac70d908bb07d5fe7a46c3c2b7ae +02e557a5f2158f343462615b8e917cd5c0d15ddb +5afc89380a1c64cc415cd5b6bd1a3c88014990ac +dfd3b0772640a6cef61ae8b8c22c272fb7b81842 +d748dd15318f2c334eff03436d16b39628b6a5d5 +931f6709af575dea11806293b4ac47c10d5ce407 +062b6840ee59b2392a433f662c4445fc8aa685a2 +d83019e714eba1871d2cda8ac8d3ddbafe6e16aa +4c0cfa91358edef5eb052a5e7783eecf049852bf +990670c2d3ce89203ff5c261b3f28afd50106415 +ff873d0bbce611262624f49b7842c1e88473afd7 +56775d8334384503b2d14a4625d9a1b04acc3d3e +80f83adec4d1b7a0cc9c26710d5dba721bd93946 +40ed6ef52ce262c1a267a87450c0e30480c7028b +e85344fac23b2e2b15684278e929c78544c7faad +3583c20d861e37497907a13f00c7a935482e9620 +9044d19b7a7513dccb28a08a432b59763f4ac72e +ca4e0d5274ee13ba02ae9dcab01ee736c184ea36 +9c7dc9f5e0d6acf45c08f965a874a2439128f458 +a48c626a6d425be00f9282e1d79e3d01aae52e57 +52ad4ea6f82ea164254f07af6149eac74618c1d6 +be865c4fa40f57272e5dfd40c12a732f838046a2 +8264cb4bdcf9e167c09fc58bc9abc2e8d49e3f6f +1f1a00f3bda66f65e9d46494843788e8f2ef125a +7c105f4f329e389683e89e2385d44a30498cf9b2 +c5a7c96bc1afddaf8abf1ebe6974604d30baf56c +ea80dd96d6b9f1ffef535c7a105857932085c1be +d3d9d92d09fffb0bca6959e4a24d7557e8670f56 +78606b8102abc087d4e7b20a0622fc8d2234df06 +a7ac6ef245053982382d5f04b4a50359807df6ae +3f5ac2b15d1d86ae7e3e311d9058379c02cc7669 +46988800ced38f20975287acb31252d70c39c371 +456d7370a11d956799d96e00c2223a110ebcd852 +cfe57a39f5ef53874b041b34ea64af5a42565a6a +2aa8eb8545b14314d42eb7c7c8479b279ea979c8 +c36c90055671e763e75d5362f709816ee033e420 +6561faa6021b58526fdab7bf34be8ebf87eee640 +6915738804450e216718d58b32d2e2dbe8edb801 +35f028572dd6d4b40e9fd0fec4be9be9c06e580d +b36900c4f3698896f96eb46358fe5b4fd33eeee1 +59d1c91d6c91d8bc265ab5cfb8666280b55dfb73 +5c2dd62ffde4808f57a27249680a6813e6c46c40 +8485ef955ca94e203575462c0fe724971325333d +67d227a23ebb6f9832277b9a2fdcbc9173bec09d +355616a909ea88715f27930c8adf4f156acb1613 +c119e92114ef0197a7c645f1eff82f64ee2024a1 +b3267af961eea08b2276594bcbbbe34ca492fc98 +916927fc4a3630306c39852877c021657ecedf77 +09904b132575b86d7176563505bc25b4e1b4d015 +714180eb1079a5466ad42c9fccf329f5d01af153 +a3e2e1b83b6114f24f8b8f832b9d9fc2881df4de +5beb03b82f992d859d20ca5789119de92b7b394e +ef7c1c21b5c680aead0a30968fe5a28fba358206 +131c4de181fcfaf1dc556c77ae222cd2f1a0588d +17ed27ef6976a6007ee11f8b8ce0121f6863b13d +ffb8f3bf070c5683d3a7d09ab712c67f9ab8d738 +bede7dceec6140c1f8be83f986d5b63221b00182 +13d392ab31985fbafc5f66ba268743d6053adab5 +40be44d9403f709d9307506bf2f5cca5059935cc +abe558e18ea5a73bdf3e1cc8854591440bb507a6 +30ea679c8b5a1141451637c127e903c7ee805559 +da50e39cbe323da02a7128033f65f6e6808bc82f +1fa6d7f9ba784a8d3fc627512754a635e13e8ae7 +de3d15f2ef68fddd91358dc6fdaead9d8d1c86ba +7135dfa36560a9ae52ef8e94e238fd53dd9c0aa9 +b3499fdbc6f1351c5393a118972867b6ea98aa5f +a4f686ddf26645594e99ccc9cff1ea120cfad302 +682dfa5bf6437d1b4c49c3b4d10ea26687878c2e +73d5f080970344de90110984523adc97e3422bf8 +a80ee24a9cb0e7f5bd9a488fb61b859005dab737 +4d1c561a5865766aafa1f3333884ec0115593892 +f938144c0abdcfa2e0b9b5710bc25fa796beddd7 +9b2b2b67d0ce12a7e00d8529d22698b64819eb0c +da43a612a62f58d522d4374c74bfc0326cdc532d +3562044c368b139890f0540dbfba36695d33acd7 +b9879ce4111617e5590326c2572bb78d94c35786 +5f645cf3aa80e9e0f953b607384c78405d3ca830 +7d699d401741e0d6b8dfb40b2f7ea19d83d6f5a0 +1da28bd83d492f116ea078fe06933efde4c6fd09 +22d19e0adbf6fbc6d637790e7b455f593a852a09 +fb4a521167a9d40705e8748734d7eb81de60e81f +f0fd5325b1f89edfb2ee8b75488ac08f3e70e402 +43bfe38cefe2126e9ba91041918b5c830f378eb8 +63ac11a6599f18e8f17acc436a483b0cc98e3fac +301460ac5d61caa5eb953fec8d259fceb995012c +f67ed9403fde1f8ba7c83ae5e4b4fb6238e400d4 +50bd4a0f70549646b322424cbb8aa4f2831e6566 +343800667d6c57bc979da307c4089a36c57b1512 +f5ba43aff798a18c3fdeefbde02096446b57efa7 +b0ab332b967f61ea202442c41cff02dea77d563a +e01cc7cde419f585eb7b96e69b58a9b06ec961f8 +f3483d15be4848e0f40d9c05a9c354d1e1412de0 +fba0e1e50ecc3ab1a3f45ea9b5ecab9d91ef0496 +54073ec2852523f3eec5a1d22bc66152b07d3854 +517a03d284a8b13f9f771bfd706b71f91977ca9e +ded7d8530e8b340842888a0e15f7b70ced7736bd +74e0ab43b344abeaa08bfc9d6cfa57df8fdd3816 +5420870264a2a43c2f482c9bf2af3b2f4602e5fc +3487192f05fc6dca302a4aa7a508aef5c230cadd +cebb55238e487bc6027175a4ab85b3c1f60fc100 +c18009ecedd27ae824deb8adefc698bf8eeadb1e +3465fadaa3c95a50ea90273dcf3a0a7e93097103 +0175f7c75946fd5026867b78ac4d90f51c2669dc +332951a3b6c51c80da263a4f6e6166c94b25adca +ffc2f2e0dbfc9d05e075aebb9d53f4d91100ec19 +a6a76d2a472a1bb0749bb218d2a2d9ce34ebed24 +752f9cd3e338935d9cac4222108a35fef72deb64 +f3ea56e2a0f3b8ef2244192af7818a8a8ea0ecec +3bc1c1a3123b9ea221f276249bc61d0cc4c5163d +47c4e5e0e42484e677a906c7af5b4f67fd4389a4 +5b0813fcca13d8fe530e0ae66d3d2434c92814c8 +ef697bdae7819788818223d9fc5fbbeeb28372db +5502a9039b624042c2518bfc1331292b5f82e4f3 +f2004bb8cda26aac63273ca097ec208c4301f0e4 +fc48aba09c706c7bbb219a4d88823b7efd40d446 +ad39ed66dac660f5fa66a3e62071f28877636ad1 +67fad4610f2cec174705c00017997ad9dd898778 +f057a0411cffa8ce650b65d3bdf33de18e321563 +912ba2b43a92b1b5ce713e51b028343b4afd44f6 +6c7be353c6949cb5da26714ac3568f889dabaa67 +c5d00d276bfd61952cc0956849632d04b01e5ba6 +4555c894638b784ad34cf895a1bbe88e464fe510 +3490b6350570bd6a71f146183bcd0befd45a0ca9 +5137e47a8c4540f39d51535a8aabb800da5688d1 +8e23b46173b1ebbbfd410f8b9cfa13c94452823c +5e8a933fbec35b8591efb472370b89a9791dc44d +2e2e81ffe87cc63e62fc4a025590784f3ecfdae4 +493c7bc0c0657bb8d00c248652bf3123cff3088b +6c3bc6a9396495d7d1f1cbf087e12b992abc4317 +f38628f3c4fac6ce8920b4263ba5af585e868e92 +1bfc50c25877a7d2792d6d24edf5353c680da7e1 +46b67a086c12c67951862781cf7d30bc55d479ec +b0084dfd896c50f62a88d340a1ae9c385ebcfeef +196e2d135e10d88805e12605719bc43693399e25 +5d7a605fdcccd3251d90437811d6344e8d6d755c +f923f6a134060e9a1c28ff321e636e5377a3120c +5a7afc553a5acc0b13c0811e2af202b277cd7451 +61519fbc5f07c67e343c4a1ccbd0a8f75d192072 +7793b9a33eac1ea487f89728d0b5d562e0f73ebc +66ce1c9b9d9b9a3ec10ed72fa4f7ed859ba54105 +4e009c6d7e2c0e197e61101a51a37c1704cd86ae +13c34c423097e2ae188f2f90af333637ee6434e1 +4bf81a8238132aca517dffbf972f2cf42b34a47b +93960275b21811e704be655cb1bbe05a477a7464 +7c2e41fa0b6b335345ae1a283017f96866d27264 +c89f1f63443347c16070d9747c3f2795d5ca0592 +77e936de59269284b019541c3da63025ec27f397 +d4696422a9be8f538eb7fdf23bf4e0f360207f4e +f4c5c3793e6b3c37ca7bef3eb0865e4ec72a0214 +57d616c3d5254b4bd2aa5961c8defa63c11e0feb +d41c037ff5849ae6e720ea85a6c6c6aaaa48f9cc +601022e9e71ac699f31415d2f00b48b8f2a4ed4c +8f567f4c24e8f60774314f6b07409dbb11f4568d +67feed6190e7de8237efff7a79432d9da9b68bb0 +8bac0245738c74eb262265b6c20ce9ef19379ab4 +429532d58fc522615928fc4e3797a6fead5b6aa4 +9c4e95014ccb410fa63975076f9adbc9fb4d6cc2 +4afa553e08a332011f28bcd8bf938b36e325ec58 +bff584338379da49eecd6604416530c2ff96c4a5 +1ea2f3eaf5c3db26e5364655f4fdc342e5d8ba24 +50bf7df3c951e64001ea2f077989dd28207a1bd5 +810c9f181afbf30ed02e516b724e2aa99fb9ea13 +abb8a1d45b38db6f0b31c12a0b997715d459bed3 +804324b4a191e83479b43614579b8fbed3e42601 +fe9a404013f10e7d51b3bc2349cf02c2b10327ff +2edb8926379aec66d203fe66a7c0183a419aaae4 +e28fd40ff72d91abb6c1a89f96fa2efc3c4c8407 +97a803dae72991c883c6a90247ddbe43f8122bfd +9dffa8258d5c13ca990f45be7154e7db3e283925 +90d4b91ec997d7b263d6895a4bc100bb3e6e6b79 +182cdc4cc661f032f5683f1b8fc2eafd9b2faaf3 +a6e7ee117eeb1e222b9d7d5289efb1e0496aac01 +80a40ece368876b16c35caffa141420d067a3c08 +084bcbc1d1d8052a59c5fe42790479ccd2ab5644 +2cfb9b25b3892ef380501b7d9f3b10b9e313cb64 +8d191f0f2266e459d844e68fc0eacc885960fa89 +31af7117a0622350fcca982ad152d45d716f4fff +81a5e1130426e77fa34dab902c0126cfa7c000df +06304bde023b402e9d35aff602f99e41d2bcb27a +d05e255fe79e72f600696aaeee4932389a77fe6c +1f4897ee1ed666cdc5d00f62adf4c52d71162ea9 +839827d7d07cb1f716453cc876e59da6af53af42 +2cf65518a6d406f33ffc80d41c4ccece209bf33b +7039fef4a1903b73e1617e1218eadd3b629d794d +78c0901a27b0dea8a296e4be8f67c02284791e20 +edd95116331f660a7a043c7b1db03d23deb15ca1 +d68e1f1d697ad2af4008b6ef05403837b229e3f5 +9dc64fb6b3f2e3768fe1cc897a2d99fc96666dc4 +5b385833affd8ed60f3a7d542c7106006fb43b72 +8d23ec97c878770b2a4bc2901217449bb7097f80 +97e43ba8919ce9dd4b5220e758317a98478f3052 +11fed06cc8b1429c42ad69d917aafcf5fe901822 +e140c9a9cee9e418560b55e8fe6adc5469b002f1 +7815705fbbd5ac20b60bb7b29685653fc9cecbfc +2bc27c0ce396aac80fa50d28ffc8647a23617347 +e0678bf40f2d915e52777e260d7eb03879cc033b +49b16f2d5431a4a36a9cd7b4f07bb36db8f107bb +7961e74d4859ec1c508ed18cba61102ed9892c4f +04180c48b6f5de21876451165fb49bed532bd6b8 +5a79aff488d04b57238281388fe9791005796932 +0b004f01837ef2a9eb92a7c7c3b1b4a3596f246f +3081dc9df702653d55ecd847ba3c0d1e82078543 +7278603f61d5250e0e32c38695f399b2eef72719 +be154f17dc05a4ef7c78028de428462c1fce2016 +3f6277298fe25d0617bb976f5533147ad110c8d0 +97e14efadfcdc7212280b7a8f4347ed178a398f3 +657c48292ccaacdd09b30a3cb725f260324e0b3b +a9fa6d5f53da250012fe0400d9981407d114f71d +3b9e90218b093eb4dcbd9dc73628843d3fedf2e0 +d2174688122257fb9cbc5c3e4a2525390c8cd43c +4a5d5eba7584092de1add3f49ea2c945501c9f95 +6aafcc9ee2f1094f0e5ed3052135e5e8501b911e +b96cd00f43c1f62506dcac0cb0d96439c42fb078 +8def1b2ed285fd15f5824cba15d64d186628dab7 +11e8a4b68a33dde32d16e4c07accdce2bff026ba +34c165d3138ed276fd389d72102c45091c66e9dc +e7af4f3173490cb94b20c53e48d71dc7bed64b1d +63396451b0494b0925dd11e99edd3bf89b04f2ff +2828a160ab798448cda07db37631082bc8039020 +a1beb7ca56619a2bd171fd695631453a20a85e2a +691cd70925b4a9f5f2c02632fd4adfc0f02a2aff +5485910d87c7d26d646267bc686b558481917c2f +2665fe6eee7131023406133be1057ce1d45c9379 +10912767aa938f25d52ad3475d6b688e07791e63 +f6ddf4b15c12503d90b0aa1c45914bc09b20330f +25f3ca00658c105233941cfc0fdbefa24129b296 +b8ecba753be4d4fad697a03d9834d43d0a053668 +b71b8a82993c89e4dccf5c56e0f3c818b6116ffd +93a7217c15e17b02b0ff20d79b8ea11b58de3ffe +f8013c0a94a2ec8f1a410a8bb27d1f73daf338dc +09935e8dcaef9d53556b6d7f00eec82c5fe5ce8f +8d441f6638c7d45289449ecd72eda2a73447a86a +593e76c9bbde9d59742db892e06436ea930cbcdf +9b4731882ddb5ea0c5df6457e2d055e9c81954c0 +2daa24e6ad7d4ed552c52a5b4cb6d0406537c87f +5c43e209e03dbb709210965ee24a614ef7dec8bd +5a51796bd074ce8330eea4df5d3bc6030a59f531 +09573435c56e3506fc467b8ce6682a73b4cfa182 +07278cdfd2928a000f1bcb6c9010ffa7f54d10a3 +fe68844cdeffd1429efa406fa378a1ed4130e760 +8f206614d2ae74086640b95dcc28744fef216e57 +4a2dae5e1fe69ec3c35fd341ee8c15febd7b1d50 +e948df012108cb0cfc327a91742e5798793466dd +d451cb2f7df13ea0a200873311c81e72fbfec31d +a81cd89002e336f631a81193cab9e9f6ec020509 +9aeb7c1f5d90f06afc4674f30cdfd029f014bf4b +70da2090efa0a359f75115fffbf3a6db62370a34 +0dec53ab3e2834b7644c4ad00d0587a4973c45fa +9a101ab30f7093307045d64ef950e763640a86af +853dcf35909977ffeec16f338b9901c051dac617 +7182494a3400d0e1496e1fc1cbe766fa85843a49 +2215007ac80f22bbb3e25ddef8a44ad9f24fe678 +27eb1c3eaa87f1f3929361e74eefa4d96cb2e8d1 +d19e6096491217476cb1ce56e5c6745101106d84 +5f2e46bf193db4549a8a306a36406cf919661c74 +f87a24a136f6c36f4908da3d34d2dd9b0e3f17d0 +b9d3c7efc3898539e77e3f29dd694a57417924eb +5fe2773f2face61f5a04516207c2c51a0cd80037 +f1af84066fe92d6de00d0f30ca8fcd09514e9dbb +534b45158843d7afcf565c4a528820a6a1c9d185 +e5d06bd8d0072b8c7b44f81168861f4f6771d68c +790ae0cf69d3fa668c61946bbc153faaf872c2fc +ad9f8971705eb0da96460d9c4855a763a1ffcffa +30fb5f14223a1134860cc893083a1b2af30c98dc +ea464af10560ad3d8433da201d613b0287b324b6 +f1de444a5e9c0f3bfffd8d4fe74a744df3fa17c6 +9d20a3f0faa5b2e19eab01704805e5449c73d10f +6f9aa0ba429c8ecfe72a17fcd0c700220051f018 +de77e3487b93964baa1ffc3ba47e6ad78db7d47f +83f1a3dcf704989b643878f8bf88e163e72afe3f +4b0c94b88ae35905d50378f3dac0d74a93a6e94b +f2243dacf8ae49cfcfc2445de5d5253d4d19c7d4 +177f13a59df17781c4b320a07bf824c09f6310ec +d62ad35d0a008e83e8b67505d78449404eee195b +df4dfe10d455e61862941713f865d95e24a019f8 +8524190eeb7100e9203b5a17278837b9968cc56d +702917a6d0ea48ce73c3ff5c59f5b98d9c8d9af0 +d0d606128474041b69657d955a07640d55b45f4d +1a3d6537a106a27978518c0f1270e42ec58c46d0 +2d9513c9aeb8b326ce10b1d151cfecdb3783a102 +97b4686e44dc2af5eebeb0bc0e05a20567dd90e5 +7daf4d888b2ab64bd7a2636f9e0541482b859d48 +ecf2ed7bdcb98c1ea6b0332887898c1eb1c5b28f +b83139c8cb1f774b7194a9cda94594de9cf3cc4b +8a3852e1fec4dfda2adb500f5fb62162e11b3363 +1cba1f1e1f6b7848c93ed565d955f5d121e96719 +aee0af5739f9efc1f0799b7149e4eb756eda6db7 +a52d53c008ccf7b0e680aa55de03cc8726bb7b78 +f8599f955fe333c1932b06d76a2d6a7610094779 +b5e07561abb38a8f4c5b931193cc7a7cf1936008 +150197e3ae172481b79a2c92517790f0201aa780 +e9875f0e1175a57b2657f3a59c2c4947d2e987fc +be2506ee14327bfa5964613c700976ef412c307d +96ed48f577f63df54ae0b1ef168e5ac81702cda4 +191780a65c832151efa971084f26bc93c8d807a7 +f4c9b5b83c6185d0ec6291eb4e95aef4647d8363 +4db5bbd8aa37648e1ab945700c99d98ff3b9f71f +568b9ae8299b71ad3dd168a17af5c86f885ad369 +58376a452f78bfaa37982761495660f8b7469d6b +e87ec70d36b17b5d64c8cf730db59f56527668a4 +57b6a161452e477a2515dc160ba6cc60fc2b0fdf +1d1cbcc1666b7960377483e848dedd77f7d36e7a +8afd7e7b1b477d1c7070b6272ee9c2f3d994e77d +03625852df79b33230634f2e1a7416251249caa7 +20bfafd3b9d983cfd06732c9e2f4b09d8f18db74 +2df30627ff513f613b21636221d03a2d8ca7fee9 +88ad87a362e6795bd6a6467b6b22f842fcbb983a +fac3c98166fd79633df8a16c3f94e6d04b41674a +3565ba1ef7ca61d2c7317227022573ba69c94990 +1bc4cf19391856df388424e8172120ff12cc251f +4805e7f2c7210962a1d906f38745070e814469b3 +d651039ad4b3425bae139be3eab147d1e642f70c +0dc26163f5c1af2413ae5c70dc9d62f7ce7bba83 +ee39e620326a38ca749bbccd2914f6e6342ea6d3 +35342f3af175e35ce9e495ef281fd73470cf645f +67f1e7251cf3f008f82ef400b43a68e68c5e02ca +7f29e1c37533b2780ee33935a67f20bd6a9604d5 +67747affec33bcd4eea5591631b0477d58063ac4 +2bda168613f11cae6dc4ca5d521dcc389c4d5f5e +5baa90cc2078d075153587efed01c659b2446ae1 +7555d22ba282fd3c73c66c93b7d937f0d1e5f9ad +79872529ac700e59fe3ad556ec8ded6dac216cbb +d16f9b01af085778bf24dbe8d9501ab9bf9804bb +f0767cd6fa38d2488299fced58ffd8943a8d54f7 +0ff6a8955b6d0e91a7cc10b65e01a7beef930327 +830aed1a5ad8a521cd02e9c3bf2a5efbcaa68529 +7f0f42d89cef00b6b0b99efff4f865c89c2d8584 +22e570e387c41ffd6677ff43f843f9a251b64aee +57e21569a1728526860ab80882a6e7bf26dcce50 +90bcada8347dac27c5202e1950567d32ffe334ea +64729144e0b2690d82962fcf48ca5a3f4f0e0ea1 +64faa630c1485a701cb4731c1f618e5653c41de8 +b2587f7b532b3d8fe4973d903bdf6077c5a55a60 +73840b973e9a89ce8cccad446fe267884d5fe1f8 +69e9d1a4ac5a2912fd254f377812c4a83fb0f3c3 +5e287b93578ec3b75eea28a74b674119e5db25be +957e2e8cb8b12813d75dc3b904b07a32d2194cff +8dfabf487c30a488b86f5140551a29f01b0af0dd +1f1460b9710923229df30ef66b4a30cba9ef0ac6 +dbb1e9707e9962b2e9b088cc323793d66ed5d433 +08a14ec463f2e223c69511351b13f81e7fa0fdb7 +c2d58db4639656b993cbe7d0254a545c5dd9bc48 +e778526efcf6e7063bc009ba0c5239b5779003e1 +514af9835fa5dc2895d3b1637a701701f6095663 +48a739bbc957d69e620110d373647294206f9d8d +9d4e2b41efa9c5fdafbecb27403f234315c5ea42 +5637fc69f0afb235d0b38d77954cf1163699d482 +212070280fe2cd876b326c9600eede00eb66e53d +6c3bbfc8507033f5a1d307e1045cb2cc13a78b31 +4b15ec15bf28fe6b4a03bb46e6b0d3bb0fb014b6 +c4d4a527afca3b850d272b2902f5b3e82c9b09e8 +a32176fc56f81786f70b60bbb25f4ce652dca7d7 +021736a754ed82291e1b9142ddf195eb81645507 +a190276ddd6097ddabbc3b491e1d1b7e89f512ff +80502155311a818d88da0e8d643e7c44e71d8ec2 +3dc34a133da27859a0da7e1b72372cf462c40844 +00b6e6566365be67d4092775278bb081a347abb8 +4015d16b0834be8bf7fb2a36edd69ecb6ff0792a +f2e1fc854cfd984184ac12813394583849772ac9 +2308d1714b2cebc6b3153da6608f4b239860ff04 +971a5fcbf1ae9a50bea65cde671741a5f33b1942 +47cf72d4d4cdf7461bb4d40adc7d37491561e115 +d6c704a6393b1190ef0c21a8ee33bac9561c0bf7 +1af6a0de8156d0085e691392270cf2023ee16719 +7debf5a25cbd49cdb9b7bae3206630e5b34cbe0a +febee784472bd7a7c2484141c9202c8c2bffad63 +d5f79fc89b5e5c336c3184ca5e3395df1081e0a3 +053ecbf6b0e6fa3ea2ae1a9c349f7964b9529d45 +0ed5a96c0071582cb1ecd8e3a3015d6007e49130 +5d796f3b5546783590da4a22f1b8ba147844fe1d +2685f29bc221723346f41938cad0d6ca0256d3db +b60fbc871e3da94dd81d0610f371bcf6e6204410 +bff0861e9865588744f6d982029cce699a63ede7 +4af0d219af5cd53a1e66b929d5576efaf28cd5db +60a9ff4a0ad0b60129047aa37f66f91e126c2c0b +480915686b667bc9bbce60bc5b906288ec6634ad +2ee478143876659850a439289183014c801b7c06 +9b3a13e2af28f4855a04c65859e4fd9f5f28cacd +db101b9af3a9d5193a86c1ce73ae5127bff13800 +29f91d0d2833df8d8b506bb458b701d1a9fd9670 +109923c526a6a1bee405995ae819ad3f0836ab66 +51001f13c881d773bac6b8f017f9e856a3bcadf4 +d0a61d0160aa07c8c1894aed0bd2d3ca89512bfc +522fff8e3d14be3039720fe58a6b5625cfe5de60 +e17863ad2f61f992bae12b20f1071ff194f7bdd3 +1cb9fdc6be1927033a2b148a3109494e5b45b78f +62988f568527f165fcb1159fbfe3d8fee6c5e6c8 +6fee9d65ea397d64a1e270ed4d9438e00813ffa5 +2f61b4be333833b1d449adbb2abb1062ff331741 +9095fd32b7e36698f266a715d8b0fee12f443f07 +1c827d75c14055e3700ebdc6897e91712e41a212 +dd5e8d75b8355a166e62c31889ad2343998ab1af +15590466e835e71943ca7e8912ed889854c089f4 +02e045a3bb655b4b1127c363197693c27a2310d7 +b03b831c365afa9a5163dfdae4597ac5ac43d619 +7f144ac937aba7aa30ee9705b20ff66af2966044 +889a25cfc1c86a86d2d04accd287e3d8e05e9b91 +7235004437b9fd751168d52127b2c7e946eb77ce +679ce96a1de64c1f3f54818063d53a4b0ade2034 +42a80acf969333895258501d3761accdabd087bd +29507b768e29d7fb924e64dac84685322b63553e +582360c55abeb7c6a367311b15567962b958889e +0f7102419fa842bc48d23ae531a17b5986b2a8a5 +cfe640e15d2592d8907dc5331a1e9c3964b88110 +336176e1717f8fbbc919b2d32032e48ee3bc8517 +8f176a2ef5b238b8dd0c7654a5300a599165222c +43900c4631a1ccf03e9c3d709263d74ebde8bfef +be65cffb0430dfdc532f0e718e76cb39714b07cc +c55dbd4a75348776f37509efb9b2dd5d788eaaf1 +4d0c9c40491d3508797a764adf3bc2f5d677e3b6 +0413ba530742056017607779e206bcaaeae89bb5 +a1cf646ff90887e25d9d660f21d30e045f603772 +0274b74452594ec46a12616dba58ca63a771c6ac +51985b4101f7d86e2eda8d86e819664067d8cf49 +7d90977c9a29a0a50a084c29a8bbe4d0ead3bb14 +b4cd62a441e943748a030cacaf2ae3fb68f3746d +572344bfa69d942ed0b07a68aac4f4a60515d492 +6c91b85c8285592d9ffeea974d728a6d6c386858 +d762d381e6731d8512314e86e6d986e1e50afa23 +b70691e138eea4504fc6df40bc8ce6c447ae0144 +7c42666f3cb963b8b7462ca8ef53e06fc8795b84 +9618215ae4c8a4f3298aa459b23f6cc0c466104d +22335292493439b08a2fb6cdbb0a877cd6b5cf58 +a2afd28dec47bf6e8269acbd6741343d84cb4615 +1c657e105dbab6ec8ebc1843c1ef91193a54ed39 +23bb50cf42b0b5783bd5d992323d17c53e319d8e +098ef3fa6d9a61827a6a383cee359a18d1260b85 +0a183f8a1bd6c3366495409f86923cd9052c3ca4 +95cfa2e6c8ecebabed0876e533b17f3560b66918 +87e6154af02aafb2a32d456eb4180869e7f235d0 +ebd944c3d17be16390d1299225684977e3954a77 +b8483ba4033aabd87f8ff4a3603505e18eda2e2e +fa3ae267745622ae5ae35860ad258b8a06693597 +a7d156f7ebf3da903aa071583b91440001a2ff89 +fdce5c23194906fa3723f0362fa5e01b0d077611 +76261b5625e1a262666a3cc35caad517a3bc1f05 +c58a3620c3b21e15aa06526927c91babde427a16 +2164c953e899771c15d26be6d18e878e5500eaea +ac1ef5eda1f38e0b83945b2bef06ee3ba546e48b +0238d0557848bed198154b2d615c27a163f60d38 +29071815e0bc6c29a8201cdb543f4ae6da57bb1a diff --git a/benchmarking/repeat.sh b/benchmarking/repeat.sh new file mode 100644 index 00000000000..ca0d607542c --- /dev/null +++ b/benchmarking/repeat.sh @@ -0,0 +1,18 @@ +times=$1 + +cp benchmark.sh perf.sh + +while read commit; do + echo "$commit" + COUNTER=0 + while [ $COUNTER -lt $times ]; + do + echo "Running $branch.$COUNTER.bench" + ./perf.sh -d "C:/perf_db" > result.bench + grep "TOTAL after 100000" result.bench > $branch.$COUNTER.bench + grep Mgas/s $branch.$COUNTER.bench + let COUNTER=$COUNTER+1 + done +done Date: Mon, 8 Jul 2019 01:49:03 +0100 Subject: [PATCH 17/26] fixed the commit variable in th repeat.sh script --- benchmarking/repeat.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/benchmarking/repeat.sh b/benchmarking/repeat.sh index ca0d607542c..72355b817b1 100644 --- a/benchmarking/repeat.sh +++ b/benchmarking/repeat.sh @@ -3,14 +3,13 @@ times=$1 cp benchmark.sh perf.sh while read commit; do - echo "$commit" COUNTER=0 while [ $COUNTER -lt $times ]; do - echo "Running $branch.$COUNTER.bench" + echo "Running $commit.$COUNTER.bench" ./perf.sh -d "C:/perf_db" > result.bench - grep "TOTAL after 100000" result.bench > $branch.$COUNTER.bench - grep Mgas/s $branch.$COUNTER.bench + grep "TOTAL after 100000" result.bench > $commit.$COUNTER.bench + grep Mgas/s $commit.$COUNTER.bench let COUNTER=$COUNTER+1 done done Date: Mon, 8 Jul 2019 01:52:39 +0100 Subject: [PATCH 18/26] Fix to repeat.sh so it passes the commit hash to the benchmark --- benchmarking/repeat.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarking/repeat.sh b/benchmarking/repeat.sh index 72355b817b1..4987578dc25 100644 --- a/benchmarking/repeat.sh +++ b/benchmarking/repeat.sh @@ -7,7 +7,7 @@ while read commit; do while [ $COUNTER -lt $times ]; do echo "Running $commit.$COUNTER.bench" - ./perf.sh -d "C:/perf_db" > result.bench + ./perf.sh -d "C:/perf_db" -b $commit > result.bench grep "TOTAL after 100000" result.bench > $commit.$COUNTER.bench grep Mgas/s $commit.$COUNTER.bench let COUNTER=$COUNTER+1 From e4b80b15f74b1c78bf40d3ad2dac7a22032d26fb Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Mon, 8 Jul 2019 01:59:26 +0100 Subject: [PATCH 19/26] Copying files before running to allow branch checkouts --- benchmarking/repeat.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/benchmarking/repeat.sh b/benchmarking/repeat.sh index 4987578dc25..397f21d80fd 100644 --- a/benchmarking/repeat.sh +++ b/benchmarking/repeat.sh @@ -1,17 +1,19 @@ times=$1 -cp benchmark.sh perf.sh +cp benchmark.sh copyof.benchmark.sh +cp commits.list copyof.commits.list while read commit; do COUNTER=0 while [ $COUNTER -lt $times ]; do echo "Running $commit.$COUNTER.bench" - ./perf.sh -d "C:/perf_db" -b $commit > result.bench + ./copyof.benchmark.sh -d "C:/perf_db" -b $commit > result.bench grep "TOTAL after 100000" result.bench > $commit.$COUNTER.bench grep Mgas/s $commit.$COUNTER.bench let COUNTER=$COUNTER+1 done -done Date: Mon, 8 Jul 2019 02:05:14 +0100 Subject: [PATCH 20/26] Investigating additional characters after copied lines --- benchmarking/repeat.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmarking/repeat.sh b/benchmarking/repeat.sh index 397f21d80fd..5dc40763348 100644 --- a/benchmarking/repeat.sh +++ b/benchmarking/repeat.sh @@ -4,6 +4,7 @@ cp benchmark.sh copyof.benchmark.sh cp commits.list copyof.commits.list while read commit; do + echo "Commit $commit" COUNTER=0 while [ $COUNTER -lt $times ]; do From e254b155822edcc72e0f543b937ed324c3cbab1e Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Mon, 8 Jul 2019 02:07:25 +0100 Subject: [PATCH 21/26] Investigating wrong commits --- benchmarking/repeat.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmarking/repeat.sh b/benchmarking/repeat.sh index 5dc40763348..668cc215294 100644 --- a/benchmarking/repeat.sh +++ b/benchmarking/repeat.sh @@ -9,9 +9,9 @@ while read commit; do while [ $COUNTER -lt $times ]; do echo "Running $commit.$COUNTER.bench" - ./copyof.benchmark.sh -d "C:/perf_db" -b $commit > result.bench - grep "TOTAL after 100000" result.bench > $commit.$COUNTER.bench - grep Mgas/s $commit.$COUNTER.bench + #./copyof.benchmark.sh -d "C:/perf_db" -b $commit > result.bench + #grep "TOTAL after 100000" result.bench > $commit.$COUNTER.bench + #grep Mgas/s $commit.$COUNTER.bench let COUNTER=$COUNTER+1 done done Date: Mon, 8 Jul 2019 02:27:59 +0100 Subject: [PATCH 22/26] fixed newlines characters --- benchmarking/repeat.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/benchmarking/repeat.sh b/benchmarking/repeat.sh index 668cc215294..a0d3398248c 100644 --- a/benchmarking/repeat.sh +++ b/benchmarking/repeat.sh @@ -3,15 +3,15 @@ times=$1 cp benchmark.sh copyof.benchmark.sh cp commits.list copyof.commits.list -while read commit; do - echo "Commit $commit" +while read commit +do COUNTER=0 - while [ $COUNTER -lt $times ]; + while [ $COUNTER -lt $times ] do - echo "Running $commit.$COUNTER.bench" - #./copyof.benchmark.sh -d "C:/perf_db" -b $commit > result.bench - #grep "TOTAL after 100000" result.bench > $commit.$COUNTER.bench - #grep Mgas/s $commit.$COUNTER.bench + echo "$commit.$COUNTER.bench" + ./copyof.benchmark.sh -d "C:/perf_db" -b $commit > result.bench + grep "TOTAL after 100000" result.bench > $commit.$COUNTER.bench + grep Mgas/s $commit.$COUNTER.bench let COUNTER=$COUNTER+1 done done Date: Mon, 8 Jul 2019 02:34:05 +0100 Subject: [PATCH 23/26] removing win endlines --- benchmarking/repeat.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/benchmarking/repeat.sh b/benchmarking/repeat.sh index a0d3398248c..09e06be14f0 100644 --- a/benchmarking/repeat.sh +++ b/benchmarking/repeat.sh @@ -5,6 +5,8 @@ cp commits.list copyof.commits.list while read commit do + commit=${commit:0:40} + echo "Commit $commit" COUNTER=0 while [ $COUNTER -lt $times ] do From 7354851de26adb9d206f558df641d94161417fce Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Mon, 8 Jul 2019 09:09:24 +0100 Subject: [PATCH 24/26] output to temp --- benchmarking/repeat.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarking/repeat.sh b/benchmarking/repeat.sh index 09e06be14f0..91e6a5e21fc 100644 --- a/benchmarking/repeat.sh +++ b/benchmarking/repeat.sh @@ -12,7 +12,7 @@ do do echo "$commit.$COUNTER.bench" ./copyof.benchmark.sh -d "C:/perf_db" -b $commit > result.bench - grep "TOTAL after 100000" result.bench > $commit.$COUNTER.bench + grep "TOTAL after 100000" result.bench > "C:/BenchmarkResults/$commit.$COUNTER.bench" grep Mgas/s $commit.$COUNTER.bench let COUNTER=$COUNTER+1 done From 37ef59684330218a0f1908b06436d33722da6202 Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Thu, 11 Jul 2019 10:37:29 +0100 Subject: [PATCH 25/26] ThreadLocal patricia cache --- src/Nethermind/Nethermind.Store/PatriciaTree.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Nethermind/Nethermind.Store/PatriciaTree.cs b/src/Nethermind/Nethermind.Store/PatriciaTree.cs index 6373990dd77..5c198f433d8 100644 --- a/src/Nethermind/Nethermind.Store/PatriciaTree.cs +++ b/src/Nethermind/Nethermind.Store/PatriciaTree.cs @@ -32,7 +32,7 @@ namespace Nethermind.Store [DebuggerDisplay("{RootHash}")] public class PatriciaTree { - private static readonly LruCache NodeCache = new LruCache(64 * 1024); + private static readonly ThreadLocal> NodeCache = new ThreadLocal>(() => new LruCache(64 * 1024)); // private static readonly LruCache ValueCache = new LruCache(128 * 1024); /// @@ -176,7 +176,7 @@ private void Commit(TrieNode node, bool isRoot) node.ResolveKey(isRoot); if (node.FullRlp != null && node.FullRlp.Length >= 32) { - NodeCache.Set(node.Keccak, node.FullRlp); + NodeCache.Value.Set(node.Keccak, node.FullRlp); CurrentCommit.Enqueue(node); } } @@ -239,7 +239,7 @@ public void Set(byte[] rawKey, Rlp value) internal Rlp GetNode(Keccak keccak) { - return NodeCache.Get(keccak) ?? new Rlp(_db[keccak.Bytes]); + return NodeCache.Value.Get(keccak) ?? new Rlp(_db[keccak.Bytes]); } public byte[] Run(byte[] updatePath, byte[] updateValue, bool isUpdate, bool ignoreMissingDelete = true) @@ -687,4 +687,4 @@ public void Accept(ITreeVisitor visitor, IDb codeDb) RootRef?.Accept(visitor, this, codeDb, context); } } -} \ No newline at end of file +} From 1b8ed382f53584d8c70b31101520f617654089d8 Mon Sep 17 00:00:00 2001 From: Tomasz Kajetan Stanczak Date: Thu, 11 Jul 2019 13:14:30 +0100 Subject: [PATCH 26/26] static cache in tree again --- src/Nethermind/Nethermind.Store/PatriciaTree.cs | 13 +++++++++---- src/Nethermind/Nethermind.Store/TrieNode.cs | 11 ++++++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/Nethermind/Nethermind.Store/PatriciaTree.cs b/src/Nethermind/Nethermind.Store/PatriciaTree.cs index 5c198f433d8..c671d596134 100644 --- a/src/Nethermind/Nethermind.Store/PatriciaTree.cs +++ b/src/Nethermind/Nethermind.Store/PatriciaTree.cs @@ -32,7 +32,7 @@ namespace Nethermind.Store [DebuggerDisplay("{RootHash}")] public class PatriciaTree { - private static readonly ThreadLocal> NodeCache = new ThreadLocal>(() => new LruCache(64 * 1024)); + private static readonly LruCache NodeCache = new LruCache(64 * 1024); // private static readonly LruCache ValueCache = new LruCache(128 * 1024); /// @@ -176,7 +176,7 @@ private void Commit(TrieNode node, bool isRoot) node.ResolveKey(isRoot); if (node.FullRlp != null && node.FullRlp.Length >= 32) { - NodeCache.Value.Set(node.Keccak, node.FullRlp); + NodeCache.Set(node.Keccak, node.FullRlp); CurrentCommit.Enqueue(node); } } @@ -237,9 +237,14 @@ public void Set(byte[] rawKey, Rlp value) Run(Nibbles.BytesToNibbleBytes(rawKey), value == null ? new byte[0] : value.Bytes, true); } - internal Rlp GetNode(Keccak keccak) + internal Rlp GetNode(Keccak keccak, bool allowCaching) { - return NodeCache.Value.Get(keccak) ?? new Rlp(_db[keccak.Bytes]); + if (!allowCaching) + { + return new Rlp(_db[keccak.Bytes]); + } + + return NodeCache.Get(keccak) ?? new Rlp(_db[keccak.Bytes]); } public byte[] Run(byte[] updatePath, byte[] updateValue, bool isUpdate, bool ignoreMissingDelete = true) diff --git a/src/Nethermind/Nethermind.Store/TrieNode.cs b/src/Nethermind/Nethermind.Store/TrieNode.cs index fa44b3858ce..3b2e378cca8 100644 --- a/src/Nethermind/Nethermind.Store/TrieNode.cs +++ b/src/Nethermind/Nethermind.Store/TrieNode.cs @@ -177,7 +177,7 @@ private static TrieNode DecodeChildNode(Rlp.DecoderContext decoderContext) return keccak == null ? null : new TrieNode(NodeType.Unknown, keccak); } - public void ResolveNode(PatriciaTree tree) + private void ResolveNode(PatriciaTree tree, bool allowCaching) { try { @@ -185,7 +185,7 @@ public void ResolveNode(PatriciaTree tree) { if (FullRlp == null) { - FullRlp = tree.GetNode(Keccak); + FullRlp = tree.GetNode(Keccak, allowCaching); DecoderContext = FullRlp.Bytes.AsRlpContext(); } } @@ -230,6 +230,11 @@ public void ResolveNode(PatriciaTree tree) throw new StateException($"Unable to resolve node {Keccak.ToString(true)}", e); } } + + public void ResolveNode(PatriciaTree tree) + { + ResolveNode(tree, true); + } public void ResolveKey(bool isRoot) { @@ -533,7 +538,7 @@ internal void Accept(ITreeVisitor visitor, PatriciaTree tree, IDb codeDb, VisitC { try { - ResolveNode(tree); + ResolveNode(tree, false); } catch (StateException) {