From: Bjorn Munch Date: November 5 2010 2:29pm Subject: bzr commit into mysql-5.1-mtr branch (bjorn.munch:2948) Bug#57840 List-Archive: http://lists.mysql.com/commits/122963 X-Bug: 57840 Message-Id: <201011051429.oA5ETec0027179@khepri15.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1247651801==" --===============1247651801== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/bm136801/my/ordpar-51/ based on revid:bjorn.munch@stripped 2948 Bjorn Munch 2010-11-05 Bug #57840 MTR: parallel execution breaks with smart ordering of test cases There were actually more problems in this area: Slaves (if any) were unconditionally restarted, this appears unnecessary. Sort criteria were suboptimal, included the test name. Added logic to "reserve" a sequence of tests with same config for one thread Got rid of sort_criteria hash, put it into the test case itself Adds little sanity check that expected worker picks up test Fixed some tests that may fail if starting on running server Some of these fail only if *same* test is repeated. Finally, special sorting of tests that do --force-restart added: mysql-test/suite/binlog/t/binlog_index-master.opt mysql-test/suite/rpl/t/rpl_current_user-master.opt mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist-master.opt modified: mysql-test/lib/mtr_cases.pm mysql-test/mysql-test-run.pl mysql-test/suite/binlog/t/binlog_stm_binlog-master.opt mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt mysql-test/suite/rpl/r/rpl_ignore_table.result mysql-test/suite/rpl/t/rpl_cross_version-master.opt mysql-test/suite/rpl/t/rpl_ignore_table.test mysql-test/suite/rpl/t/rpl_loaddata_symlink-master.sh mysql-test/suite/rpl/t/rpl_loaddata_symlink-slave.sh mysql-test/t/key_cache-master.opt mysql-test/t/mysqlbinlog-master.opt === modified file 'mysql-test/lib/mtr_cases.pm' --- a/mysql-test/lib/mtr_cases.pm 2010-08-30 09:25:10 +0000 +++ b/mysql-test/lib/mtr_cases.pm 2010-11-05 14:26:38 +0000 @@ -170,8 +170,6 @@ sub collect_test_cases ($$$) { if ( $opt_reorder && !$quick_collect) { # Reorder the test cases in an order that will make them faster to run - my %sort_criteria; - # Make a mapping of test name to a string that represents how that test # should be sorted among the other tests. Put the most important criterion # first, then a sub-criterion, then sub-sub-criterion, etc. @@ -183,24 +181,31 @@ sub collect_test_cases ($$$) { # Append the criteria for sorting, in order of importance. # push(@criteria, "ndb=" . ($tinfo->{'ndb_test'} ? "A" : "B")); + push(@criteria, $tinfo->{template_path}); # Group test with equal options together. # Ending with "~" makes empty sort later than filled my $opts= $tinfo->{'master_opt'} ? $tinfo->{'master_opt'} : []; push(@criteria, join("!", sort @{$opts}) . "~"); + # Add slave opts if any + if ($tinfo->{'slave_opt'}) + { + push(@criteria, join("!", sort @{$tinfo->{'slave_opt'}})); + } + # This sorts tests with force-restart *before* identical tests + push(@criteria, $tinfo->{force_restart} ? "force-restart" : "no-restart"); - $sort_criteria{$tinfo->{name}} = join(" ", @criteria); + $tinfo->{criteria}= join(" ", @criteria); } - @$cases = sort { - $sort_criteria{$a->{'name'}} . $a->{'name'} cmp - $sort_criteria{$b->{'name'}} . $b->{'name'}; } @$cases; + @$cases = sort {$a->{criteria} cmp $b->{criteria}; } @$cases; # For debugging the sort-order # foreach my $tinfo (@$cases) # { - # print("$sort_criteria{$tinfo->{'name'}} -> \t$tinfo->{'name'}\n"); + # my $tname= $tinfo->{name} . ' ' . $tinfo->{combination}; + # my $crit= $tinfo->{criteria}; + # print("$tname\n\t$crit\n"); # } - } if (defined $print_testcases){ === modified file 'mysql-test/mysql-test-run.pl' --- a/mysql-test/mysql-test-run.pl 2010-10-19 12:01:14 +0000 +++ b/mysql-test/mysql-test-run.pl 2010-11-05 14:26:38 +0000 @@ -662,22 +662,40 @@ sub run_test_server ($$$) { next; } - # Prefer same configuration, or just use next if --noreorder - if (!$opt_reorder or (defined $result and - $result->{template_path} eq $t->{template_path})) - { - #mtr_report("Test uses same config => good match"); - # Test uses same config => good match - $next= splice(@$tests, $i, 1); - last; - } - # Second best choice is the first that does not fulfill # any of the above conditions if (!defined $second_best){ #mtr_report("Setting second_best to $i"); $second_best= $i; } + + # Smart allocation of next test within this thread. + + if ($opt_reorder and $opt_parallel > 1 and defined $result) + { + my $wid= $result->{worker}; + # Reserved for other thread, try next + next if (defined $t->{reserved} and $t->{reserved} != $wid); + if (! defined $t->{reserved}) + { + # Force-restart not relevant when comparing *next* test + $t->{criteria} =~ s/force-restart$/no-restart/; + my $criteria= $t->{criteria}; + # Reserve similar tests for this worker, but not too many + my $maxres= (@$tests - $i) / $opt_parallel + 1; + for (my $j= $i+1; $j <= $i + $maxres; $j++) + { + my $tt= $tests->[$j]; + last unless defined $tt; + last if $tt->{criteria} ne $criteria; + $tt->{reserved}= $wid; + } + } + } + + # At this point we have found next suitable test + $next= splice(@$tests, $i, 1); + last; } # Use second best choice if no other test has been found @@ -686,10 +704,12 @@ sub run_test_server ($$$) { mtr_error("Internal error, second best too large($second_best)") if $second_best > $#$tests; $next= splice(@$tests, $second_best, 1); + delete $next->{reserved}; } if ($next) { - #$next->print_test(); + # We don't need this any more + delete $next->{criteria}; $next->write_test($sock, 'TESTCASE'); $running{$next->key()}= $next; $num_ndb_tests++ if ($next->{ndb_test}); @@ -772,6 +792,11 @@ sub run_worker ($) { delete($test->{'comment'}); delete($test->{'logfile'}); + # A sanity check. Should this happen often we need to look at it. + if (defined $test->{reserved} && $test->{reserved} != $thread_num) { + my $tres= $test->{reserved}; + mtr_warning("Test reserved for w$tres picked up by w$thread_num"); + } $test->{worker} = $thread_num if $opt_parallel > 1; run_testcase($test); @@ -4575,17 +4600,6 @@ sub server_need_restart { } } - # Temporary re-enable the "always restart slave" hack - # this should be removed asap, but will require that each rpl - # testcase cleanup better after itself - ie. stop and reset - # replication - # Use the "#!use-slave-opt" marker to detect that this is a "slave" - # server - if ( $server->option("#!use-slave-opt") ){ - mtr_verbose_restart($server, "Always restart slave(s)"); - return 1; - } - my $is_mysqld= grep ($server eq $_, mysqlds()); if ($is_mysqld) { === added file 'mysql-test/suite/binlog/t/binlog_index-master.opt' --- a/mysql-test/suite/binlog/t/binlog_index-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/binlog/t/binlog_index-master.opt 2010-11-05 14:26:38 +0000 @@ -0,0 +1 @@ +--force-restart === modified file 'mysql-test/suite/binlog/t/binlog_stm_binlog-master.opt' --- a/mysql-test/suite/binlog/t/binlog_stm_binlog-master.opt 2007-06-27 12:28:02 +0000 +++ b/mysql-test/suite/binlog/t/binlog_stm_binlog-master.opt 2010-11-05 14:26:38 +0000 @@ -1 +1,2 @@ -O max_binlog_size=4096 +--force-restart === modified file 'mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt' --- a/mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt 2009-09-24 14:52:52 +0000 +++ b/mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt 2010-11-05 14:26:38 +0000 @@ -1 +1,2 @@ --binlog-do-db=b42829 +--force-restart === modified file 'mysql-test/suite/rpl/r/rpl_ignore_table.result' --- a/mysql-test/suite/rpl/r/rpl_ignore_table.result 2008-11-13 19:19:00 +0000 +++ b/mysql-test/suite/rpl/r/rpl_ignore_table.result 2010-11-05 14:26:38 +0000 @@ -141,3 +141,4 @@ HEX(word) SELECT * FROM tmptbl504451f4258$1; ERROR 42S02: Table 'test.tmptbl504451f4258$1' doesn't exist DROP TABLE t5; +call mtr.force_restart(); === modified file 'mysql-test/suite/rpl/t/rpl_cross_version-master.opt' --- a/mysql-test/suite/rpl/t/rpl_cross_version-master.opt 2009-01-27 11:33:30 +0000 +++ b/mysql-test/suite/rpl/t/rpl_cross_version-master.opt 2010-11-05 14:26:38 +0000 @@ -1 +1,2 @@ --replicate-same-server-id --relay-log=slave-relay-bin --secure-file-priv=$MYSQL_TMP_DIR +--force-restart === added file 'mysql-test/suite/rpl/t/rpl_current_user-master.opt' --- a/mysql-test/suite/rpl/t/rpl_current_user-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_current_user-master.opt 2010-11-05 14:26:38 +0000 @@ -0,0 +1 @@ +--force-restart === modified file 'mysql-test/suite/rpl/t/rpl_ignore_table.test' --- a/mysql-test/suite/rpl/t/rpl_ignore_table.test 2008-11-13 19:19:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_ignore_table.test 2010-11-05 14:26:38 +0000 @@ -174,3 +174,5 @@ SELECT * FROM tmptbl504451f4258$1; connection master; DROP TABLE t5; sync_slave_with_master; + +call mtr.force_restart(); === modified file 'mysql-test/suite/rpl/t/rpl_loaddata_symlink-master.sh' --- a/mysql-test/suite/rpl/t/rpl_loaddata_symlink-master.sh 2009-11-28 04:43:16 +0000 +++ b/mysql-test/suite/rpl/t/rpl_loaddata_symlink-master.sh 2010-11-05 14:26:38 +0000 @@ -1 +1,2 @@ +rm -f $MYSQLTEST_VARDIR/std_data_master_link ln -s $MYSQLTEST_VARDIR/std_data $MYSQLTEST_VARDIR/std_data_master_link === modified file 'mysql-test/suite/rpl/t/rpl_loaddata_symlink-slave.sh' --- a/mysql-test/suite/rpl/t/rpl_loaddata_symlink-slave.sh 2009-11-28 04:43:16 +0000 +++ b/mysql-test/suite/rpl/t/rpl_loaddata_symlink-slave.sh 2010-11-05 14:26:38 +0000 @@ -1 +1,2 @@ +rm -f $MYSQLTEST_VARDIR/std_data_slave_link ln -s $MYSQLTEST_VARDIR/std_data $MYSQLTEST_VARDIR/std_data_slave_link === added file 'mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist-master.opt' --- a/mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist-master.opt 2010-11-05 14:26:38 +0000 @@ -0,0 +1 @@ +--force-restart === modified file 'mysql-test/t/key_cache-master.opt' --- a/mysql-test/t/key_cache-master.opt 2003-07-06 16:09:57 +0000 +++ b/mysql-test/t/key_cache-master.opt 2010-11-05 14:26:38 +0000 @@ -1 +1,2 @@ --key_buffer_size=2M --small.key_buffer_size=256K --small.key_buffer_size=128K +--force-restart === modified file 'mysql-test/t/mysqlbinlog-master.opt' --- a/mysql-test/t/mysqlbinlog-master.opt 2003-09-24 19:25:58 +0000 +++ b/mysql-test/t/mysqlbinlog-master.opt 2010-11-05 14:26:38 +0000 @@ -1 +1,2 @@ --max-binlog-size=4096 +--force-restart --===============1247651801== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/bjorn.munch@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: bjorn.munch@stripped # target_branch: file:///home/bm136801/my/ordpar-51/ # testament_sha1: 7e91ad43927f9dfe0c008b6c373f723590677658 # timestamp: 2010-11-05 15:29:40 +0100 # base_revision_id: bjorn.munch@stripped\ # fltvohh2z890zgsd # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWScfEL8AChvfgFAwff////em Pa6////7YBK65rWfUsd2iEAAKAAA7HRxQKHQZAkFBKgQFCoAQ00qn5DSm0TRoNGGm1Q0aAyHqBkN A0NGm1AcaMmRhGIBhNBgE0GgZMmjJkMIDDTQIKKZtU00NMg9Rpk/SRoaDIABkZDRtQJERGhJiA1U /0NGhGhiTG1U9pNqE0aBtQPKAcaMmRhGIBhNBgE0GgZMmjJkMIDCSQIGgCGgTQE9BNSn+pkEbUEy AAGyjgfgFAEgBEhCCe2nQQfzm0s7kdELI2Y+W08TZbBZtpzSSEiQWnyvyDeQRICgBTRXSy0Yy6lQ RJkOUGcGn7NM56uO7f0zr4vtP7LHtrRJD+nMSzhiAvZOm7X9Nua9CuYGDDfaMGKWgLb/B7ogcO3E 7GyMDAIJRWeXD0C3eLVcgyHoVV5oM6IgQMmclARjbbGMbbO1QEDCUzUdvjq23LZrPrz+l7vg78oZ fMAjwSiIFOQqkxjJiEjVYDqQcsCNImrvfWb83YdX+jLe9XOJf4QetDGkMY20gbF9ckhaTuj0XBCo wZI3+u28N0Y3cKUxOgzlVN45O9qC9oEWvWaA5Gehu7UMFBkLGDabNFVqVKB6yyuWvW04c/PsdXsM Zae4VbXHb5OZifyo7q8O25mPvnd61HkVRsh8vxrwIRM3WYBMxG5ap19WkxwLxXymZy3XCAK4tWJx FLCwkNqhLJ1kqdIGb8iQ922yEnn3WCVz2tlfRBraEk6z9tlP8Nl78ItPTLK+EIUW7HatB7oU5xhU 7EEnbm3Wxa3N1jq62pxmaSsOdej1nW0PRDVes7r4/XgwXRt93cHfbdhmOLZM2pt/Hvx6o8q98ckl On35kvQNRRseMHO11cdhJzV/ZRxmZ8mjUb2zPr7u1AtF8AKjBjEB815ksiIZgzzf5DloP8tKzLml Uet0vgqw6qwfg0fe1caciVC2dAKDLZRUHNgngXYnuV2R3n6oZWtEXoaRqIKc9O64K759IaQyxLP4 ANlx9ah7nvMS36m24MBaPHDSG9QZLxJLEgB92Lfq8Dn1SPTGbJZWajvagBvxLXnEfOa+yD3KipEP F2BqMKZb+vlfRS/v3RKQ5iTHbTbiUgr2aQbiXSzYcoiAx0KBRHFz6bH7SuN1dgZKkSB2I8SDc4Sc tVoSCD3KythKkotiJS/dUF9DT8MEC4GgNLUPnaRvs1HNW45lNrq7hgaBoVS4gjKAV8QCRKQhxcMH M6ypmolUuzWKKxhSKZCcFTyKECqMuJIqiAgQDDEk1UOU9PniWDOGBhEKc5kRV0YQO1oQpRTrliAT VqvJmByOLiAwqYCsK6qhh5zP7EHrZcjuDJUwSSZkr2FKu55QDUFJlGBJH9WEgzaKcnKBYLAiw4AK TeY+N5VUwkG8wFUXqUbCZTXZvFKioK3DzAduHgzRMKCJDB6tM4X4Q30WG/qSlsvJCvFUKAs2VQqY yLQCKpACiZFiRDrnMheGJsyGWQ8knCuHUFoTGKrz3el4Pv2kJWGKerbbJCnUml7SEqCgqpLDISka 7MS03tISuEy7i843XmJBi5r4VNLJ9MpYk6BhOrkCoBkgcyQhz2HyHokPKDVfmST4kzBaltthImjN RcXkguqKSQMPdCY5dGKIupCotAB5sLCJxHWF6qukPKtpsHJQTy1OKr4GsooCwvLsCZWOOcR520mp sxTfieXmuqw5Pbdsti+cMXTopbMLRijOjhVUTMihOZckUESmFxADZWMOUCRWQIvI/qMLdQOHZ915 Ckam4xjRFdImldp4l5odh6mFQAVdhkbMi9UVEjtMjmOKTAtOhWL9plFEqTMyNpuF8iBwetjGxzGO VWDReOkctJKGxwBtJSk8WRwhcZh8YMAINQu3ZS8hliTUYmkWAUgcWjWDTGBolBIwJlNhSVQlSaNT hEovL95gLMqYTTSVdxPQyFeU9hQUkBYjqT2F2ryIDcjPerxtxi6bmydDkYl4opRKTQx3xBA+WqsM 5TCKoBqxxzExZMnSWI4yiTIjx5N+JYZnaPFUxQrjLBx/Pn5ToiTa8yyJFNPPcZhYfB4uMmOuRMwM DuNpYRMH1G01Pc0gLwIjvITETE7KFXZprlwjmsHs4Jm6mtsg0kvOsHlVbOUk0CZb4lhKiJqVczlE iVgA1jWipJmEjEVhQUkzGggVGJIuKSwmYHeWqONURpzHcCY6Y4dV3Cq43gEjTsrKSJYaDGR3Ykza KB4rE5GIqgmWDFJMnyOgtr9LAgabOG/S1+cL9DUykFWJRAogyoMhxBw0Smk9dhx2lZRTbeNvxCgs LSnFjeYGQ2VTbpyM6qlLbWAVdxGYsToUUGBmZnSxrk8iYQ4nYZlRxXEXAvN2yzU2bh2FjoxxeQAB xHZVBiJRQRYeVRNpVSUEJZjkU2V8FZB+waQt9xCZcYFEC+91TivkuzlhRwaXGouY1FQXFpeXDsKB xMY2DFZ1PkW+VMpLC7CbWRcOURlcZZUqURMsKK4IgsR8iJI0sLTdVOgsT7jcthO0jEtJjP1HXWBQ XZ6NAkKmNRMsIQGE8APaZlf88SllNkp2OxaApwYeRi0YYvSUpPAALmERKPRUABoKLftaeDynL9Oy 7lB4DRgFEu2BuSX8/Xhmvx/J7Yxo8a5DauBMbTY7MfgJOSUQ2xjG2hDr06BKOv4tJEbn5Da8PHMv eJA9PgXn2HqHohNg2DQm2H6952FPsVLn9D6k9oOcZhD7Bg/BIFSM5xQ4WGt/gWjNcq6+5UFtiEWE xpD8RdhuVypeYtECTSuF81CAm0BQXsnAoVHWIW3qhKQSvqrCkRImQpFQV6or1a36cDj5QF4tn3+X l4EHDbAA8T8YEvM8j5/Izq+pU/EXCVMA/Q/QtKDgarYagZE68CsiBd4/difZfx5CQaHLBSExmgbA uExW80pqQGpQZHavrTswhg95UsPr3lowg2Riu8iTsguI3Pj33hBkktzf0yuEVszIM0BvpZRiMG0B Bi4zAUtjS/TfcguzHWXrrOj+XcdSQAageC8sXsdgEF3Hct/8zw8KRWh4jGhQeHlAYZzzTxFRAOQv kczvPkOP+qY9nQidnzhp9mPsM5oIgbUQIJJhJ38swPDU+Rr7MLadCrq5470KjzpIcjd8JIPH0Ly5 hTGOQ87R4u0cczTT+hAWgxiAHBXXmR1gm2WF56HnMzO1dSg33e6FuPL7h6z86zmLeVgIrs2DFHBz iCcJBGNp/VCR/l3Qi3ZrOWfoEl4FF2m9mUqCToXOKuVWwbB6M0q9p7RxEmdgOF2dvGpEj3NhUV2b qRiRaAXjHIgWgGBCwrSS+DBGAukzA1NDMTdDYJxxPEVRmL3/f1WpgJ51MTacdpYY90u3+bMy3+Fr cVUPKzmWmSA82o+ouoAe9vBd4670PU2cs3zPI9TkeAFcfIdv6a7RQJrZ2OxL0lVXyB7uIlmeHQIs oAgkoANk8czkNzFP48/EzGPS4b0HvstUfSU3xedfSs5VlBSqqGbwgdwrTEoHFgnDGYbOgkwljy54 sJNB6gJWoDUT8UyXAWAwuG0d4nTkc3yG8h6LCzSDYH1uW83lIG07OyPtacJtBhyMYVjtwXWN5/k4 4FRu8OmppY7V+w9oupEFTk4AiMVPhuqaEklDo48VJwFWBWC9ZQhWcvDnZeSEB2YfnLaDe09Fkvkw RNUghIaqXmuJQD9Zp7jvgjwLwMEJcC2GNpZQYoJjMHQS4nqdo8Xngdx29TqbyASPWArBd5Ud4xAm GDysWpf4vHEzvLi8viRN4ySuidoxsSWQARAD6cvqJdRLES2o7jYrlqUoP96Aigb1/GZ9bInzbiUn SZd4FDrxbfbHawPaoY7OHM8jqSBXlYuYgf7nh7DwuF8x5SeBoqiPjmvQTti/M0K1BJBAiJLgUJvU cR3sG1/zbgZluTlQCrMvSAFi882AFUaOLiny7QQNYbSh1bAOBoPb8KxPXzEb+hnuQlyzjhP6PubZ 5PQktOAus2m0/I7zuoEIyuXKZ39C75f2uk9AYKxHOwDUY3nACoQTjXs+7yr+RYZCBmG1FgZcjRE2 Xn+XVAekTEikMAdwVQ47dxxKBbzj66CVHkVHyHG40PY8z2UDQxPt3CQbSoXgcSw9R4fXU4DHj6lD xO5CsHdLBgAdyX33G439UBqVH4HM7e84mQrtu7oSOvjKK2gd5jVJRAZxSJXBgJZFvRTU9zMASy/4 Oj6wPjS5fBUcsdSYlf27RIGE8SmnOEslo9s7FNt+LHkLO+LHowYspIJ1iVDA1riSyAI+ax9cz3VM lidxlUrDwQkVCirbt+6smfbUpPMieAGo22K9Sd+rDCDI24j+o7jqeoqehdYca46k0k2LJvQppGPP v/ASD4FSbzr5Kr7/vZ1R9LOgTdaILezXs4uFtyR/6ZGVVRIGo4HSh7jsKCVisWZGnjYk/jPpvzcr Ego4TgA1jDD2mMGaiJJtHGz+PioySVhpVk86EQJ3OEHwVLvIGv59nmLE8/kbJ6HCQNpsAzVJWyoU 9fN7nL2lAKnIWPZZX+w90HS44QIdB9BklBIPU9FwPfOAkj3tcYFVblawlFiMcfZ74GrZX9THcMwG 8Y8F515GBwR6CQTQDhH4MjhR74kNBck5cEkG7ewcJrRU/s25rcvg1ttN4sPIoHXpJQPTUXgaCt59 OwfqwkwBY+4W54gbfd8Pw3n1sOehn2o5AlbN9Fnf4lVCiZXJL8kx9D6ReTrORsN5gMLQ4HEyTz5m UDqAFR+8tQLA1GWo5sjaAHAaSkNmuHEN7J85ZwEIDpHvnWYFVTrjFJCwXFAIq2mlOZFNcpKyYBvT bQdUOv3V3AcQlYcxbvOr41SXQb6AvnKejtEHSLiWByq4kQj2lrcOUYrg97G+AbHDbVYggXSch6TS oOUsZtCYjQ2xsTdSZljpnOCqF1niLpLXOz6y+jG8lnmH6rVoqJ72Mjmk4kAyIU5u46CaIrksjORb cyPAz23C0qM+VuHoZUFNRePUVT5I2sI1En0ZbWAGICVpNCulVEP1IqHta7Jo5hLnbbbbbbehSerc gXgcfQmbGjjabGDXGyGAFnkSAb4skBRIriOgiV7lVbOIqLqPQLbwnKA2bzIHBE6I5qEa7qPho7z8 4niHU9C2zCJPlBWStqFwezodJhscTXfRaqgWjLHxXku07yypqZ5uqrmJUXqgEnAnqgCi0WUUkcC+ quaXJlPf3yWSWd3gHYdAD5FyczSVJaGMEnaGa6CpUUbGtHuEUl5HZfV2EgHmyipvnlWZC3L4XsWF 5fydQgHqsgancKgjIoZZYuE2EQCQOKZme1fBEoYp0OzmUnodTdeuQAel0f0tE+SRzDjY9YFzlgv7 9RINaWIMWkvukLcua4ByeQPE2jjYe2/6NSdtIAdxiMkwi9bE69Q1KS6tAdGcu6sszMDQAMa9exm3 FhxMioywMVQZMvuPYdxPBODuORsedbhcj4F2B0KuZeZjpDyPeelZ28TwqJUDrBlUMkg+mSqLgOJK esWc1s4PguhyJFxVajmcfiBadDRd4qjoaPM0C8TaLI/Q8TgfakV1efyXgKFhzFccxfPsSXkUFq46 HYQLVc4APUzvPy8vs0Pd+aSJpSDtWOO2tJH+39eXorUfrZDu+3/xdyRThQkCcfEL8A== --===============1247651801==--