--- /dev/null
+
+# system-level upload+download roundtrip test, but using shares created from
+# a previous run. This asserts that the current code is capable of decoding
+# shares from a previous version.
+
+import os
+from twisted.trial import unittest
+from allmydata import uri, storage
+from allmydata.util import base32, fileutil
+from allmydata.immutable import upload
+from allmydata.test.common import SystemTestMixin
+
+plaintext = "This is a moderate-sized file.\n" * 10
+
+# this chunk was generated by create_share(), written to disk, then pasted
+# into this file. These shares were created by 1.2.0-r3247, a version that's
+# probably fairly close to 1.3.0 .
+#--------- BEGIN stored_shares.py --------------
+immutable_uri = "URI:CHK:ye2ysmghj7lpg5ovicm4lvg2pa:semuurrfflv6f6r6j3kfzczs6euhvq2ulodbzjo3ffpszyr7uyrq:3:10:310"
+immutable_shares = {
+ 0: { # client[0]
+ 4: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazniel6dyc2y4selq5g3q3fsmqwl7ez5zu5bnngujv3bbnpzufq3dxcsulgibrvliyxz3ogr4s5nhw33mmlm4srz3ohxynpofjcsrml6lxjw7rrdtf4qcf45jr7c2bi6j6gymjwsv43rvp5iqjqptfq766zwmeuvdnwlgay4maaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxftxuf343nydrqxevhq4zx6brini7korh2b7mcqe745ulw4tk4hgvgaat55bo7g3oa4mfzfj4hgn7qmkdkh2tuj6qp3aubh7hnc5xe2xbzvjqacvkpun3f6fnyz3dvbyc4fwcvznp6o4wknl6xwnsfer4yghvat336maahr3okegsj5cegqafjbcuvq7kyzzujaaoiow3hxqxbegkewsv7skvaakb6tjqxdjkibbwep3ac5pkwmk2vhvrsbw2pc4knr6davra6wtovdaaajsd53ldwhzhl6okhcusnyoyqraissoydm77lcq4hho4ffd54tmpoaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvwozhsop3jvrfbojc2zdg7o257xegzrhec2swrn3betd5kraeu6gaurdmjkcapnmgxibh2pmuotspxcymloyjadpypap6kfwojqxudjfpk2wa"),
+ 9: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazmgpjamkxrlhwlfdjvpzi5hfst2dzbjw7d5rlfznrrznyt5vlhcqnzc2ocjmw6b5yd76pclscxvomntygccwaexqwm65njkijkjq46pq2v762rczmsasnyqmlhagatv3gg72t7inn2leq4pydfb3mxvshvejmo7m3spi53piaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfsgfk5w5idl3j6lozxyjkctei6xjrgfaigptt2enmepzja7j5yozmaayrrkxnxka262ps3wn6ckquzchv2mjricbt446rdlbd6kih2podwlaaanv3xibg6ca7t6ywtbzjco3z4m6o24vqqbwygvw6wh25rrex4fwh4aaybvqu3gmlomi3dnf2tum3hoseavpesyia2i2wqgwbmbtrgmotu6oaadirzs2idl54toffh4a2hehvg2e3zoed4dr6pcdpuqpnz2knte7gqqac7gufkkuwa3tktmf7g2lnhpmb4cvzl42pxui7tbyxp2y564vxptm4aaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvwozhsop3jvrfbojc2zdg7o257xegzrhec2swrn3betd5kraeu6gaurdmjkcapnmgxibh2pmuotspxcymloyjadpypap6kfwojqxudjfpk2wa"),
+ },
+ 1: { # client[1]
+ 3: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazmwbygc64rtlparkjs7mrq5qmt7cygcurakr3vqtundyz4zm5lnibvsgwjh65tqlmf5m42ya55grnmqfhui5m4wtiq7sw74izax6mhtc4f4amjsv64nejtsavtpkiy4tudmrafoq5t4fxxm3lphrfrhz4m6j4q67caqgexapqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxftvgmgcmhjx7v2k7wt6elymxudbyypcq3zztusnavpv732eayus7iaarz66zcgmrzdtweg4oqgzgc36wxsrkf7xwfcaaqsieirc6ldy3ftyaaateh3wwhmpsox44uofje3q5rbcarfe5qgz76wfbyoo5ykkh3zgy64aajrdvnfky53hd5dhpl7hgzaasaomcgo6fmrjwhw2rixnbsqawddlqaajouzqyjq5g76xjl62pyrpbs6qmhdb4kdphgosjucv6x7piqdcsl5aaa6cpv6nqakhbz7ult4pmwttujfmavcvu7uqtha3xlhug5a4vpuhaiaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtbf3v6zafhuglsmoqbz2ohhh2v5ulix7stqluqrzuc5mylop3v5kpuut6vfm5g2efnmvunk7khynlrj3mfbtkejprhgxazi2yie6hvjfpk2wa"),
+ 8: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazm4uz4iyzic7t6ktbvjola42pjdturxj55uks5phrbyxo4uqhdk3t5zdn7zkfvbh2mj33bovodak3ou4zbcyyp6mcoro3aqqxszhsgblcc3crznf2zeeofllsgzav5nc4pyh3ocblw3vhs6atocb6j42lovep4dp5zb5epyoqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxftgufkkuwa3tktmf7g2lnhpmb4cvzl42pxui7tbyxp2y564vxptm4aayrrkxnxka262ps3wn6ckquzchv2mjricbt446rdlbd6kih2podwlaaanv3xibg6ca7t6ywtbzjco3z4m6o24vqqbwygvw6wh25rrex4fwh4aaybvqu3gmlomi3dnf2tum3hoseavpesyia2i2wqgwbmbtrgmotu6oaadirzs2idl54toffh4a2hehvg2e3zoed4dr6pcdpuqpnz2knte7gqqac7gufkkuwa3tktmf7g2lnhpmb4cvzl42pxui7tbyxp2y564vxptm4aaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtbf3v6zafhuglsmoqbz2ohhh2v5ulix7stqluqrzuc5mylop3v5kpuut6vfm5g2efnmvunk7khynlrj3mfbtkejprhgxazi2yie6hvjfpk2wa"),
+ },
+ 2: { # client[2]
+ 1: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazm4looclcc5kqy6qfzzetsrmup5pw2sdecb54uxjhhsvyzin6ibfer76axpoh2vxxgfv34e35r3bfvpnvzqrt72flzskrx323t7ep4l32eir42sbvdswhqqkljxpy2rfa4j7yx4tmxccawhp57odyjzkkaqgcny246hrtdevqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxft2o45oiypn6bqokxqmpynseggmzoempbkssoyyu6puanxitj7rmcaai5q6234vnzjroot3erj2luheqecq5sikw6w6txbslsdvcphzionsaaehu5z24rq634da4vpay7q3eimmzs4iy6cvfe5rrj47ia3orgt7cyeaaezb65vr3d4tv7hfdrkjg4hmiiqejjhmbwp7vriodtxocsr66jwhxaacmi5ljkwhozy7iz327zzwiaeqdtartxrleknr5wukf3imuafqy24aab7c6gvrnd24kyscutnjiybvzgy24wcrqjszirhldprsfeanr4tnzyaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzqye3fh34m6ylyv7auginhhusra6fst3yi5n375nt5vzebwbbule2vxvolhomvqvzaiu2dyykr4da3ogfgvxazpmxe5uv5p2cczfgbjfpk2wa"),
+ 6: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazm2y2oc6kqfofytgus6zm7b3e7jnjy2rsnoucuc5jyhwwehcbxnhdkgxr2h2ref4bkf5ufhhjzanmnnhhvbbwf4fmx7qrodh4mcblrofq3mk3olficr4q3owwisjmuzvznajzf5fdeizjq72vjvwz6yijx5tdcj2nphzthwgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfshy43k3bviz3meybqzoukf4kd53nf5osrx7z4gdhrwvmfzhkzbecaajiyd6vrn6vqtmhx5r5pany722qg4etoi2crh5i2euk3eh7globo4qaateh3wwhmpsox44uofje3q5rbcarfe5qgz76wfbyoo5ykkh3zgy64aahr3okegsj5cegqafjbcuvq7kyzzujaaoiow3hxqxbegkewsv7skvaaky7dtnlmgvdhnqtagdf2rixripxnuxv2kg77hqym6g2vqxe5leeqiac2thalz4fpmumxp7kgrgvvuz4hvrwx4smdym7ibalebngkols6fhuaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzqye3fh34m6ylyv7auginhhusra6fst3yi5n375nt5vzebwbbule2vxvolhomvqvzaiu2dyykr4da3ogfgvxazpmxe5uv5p2cczfgbjfpk2wa"),
+ },
+ 3: { # client[3]
+ 2: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazm4db6fxwaqyebrmu337bw22gluncfkblxbevg4citokkylk35mkzhvcbouvqfov54houq3z2cyqap3nnq2lbowhj25qalpjz5byjdrpyo3n5iqjny7h332alowkyvs5vd3wbycwbc27z43ilxwmhkpepmrnq3yi6mxmiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfth33eizsheooyq3r2a3eylp226kfix66yuiaccjarcelzmpdmwpaaarz66zcgmrzdtweg4oqgzgc36wxsrkf7xwfcaaqsieirc6ldy3ftyaaexkmymeyotp7luv7nh4ixqzpigdrq6fbxtthje2bk7l7xuibrjf6qaajrdvnfky53hd5dhpl7hgzaasaomcgo6fmrjwhw2rixnbsqawddlqaabgipxnmoy7e5pzzi4ksjxb3ccebckj3ant75mkdq453quupxsnr5yaa6cpv6nqakhbz7ult4pmwttujfmavcvu7uqtha3xlhug5a4vpuhaiaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvpjxayjs6a6gsbgtc6alf4btfsknnp2dughizg2mxczvyei43ercpnwkg2elbckugvohnchlib2na6n4vj46wkilwuf34izdqbdp23jfpk2wa"),
+ 7: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazmw432y2xbyxpehrm6avy5xdp4bupvhsrezflvnbrf7d2gv4tfyv2c7mw5xfkoaflhtla3p55ld7i5kgyhlk3n5tjlofy6sbzouerqkzfxdvcmhpbksf7zdjyciiv5ur23f4bpre3jv4wk75yta3hz5r4bgex52d6zz4ykglaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfsthalz4fpmumxp7kgrgvvuz4hvrwx4smdym7ibalebngkols6fhuaajiyd6vrn6vqtmhx5r5pany722qg4etoi2crh5i2euk3eh7globo4qaateh3wwhmpsox44uofje3q5rbcarfe5qgz76wfbyoo5ykkh3zgy64aahr3okegsj5cegqafjbcuvq7kyzzujaaoiow3hxqxbegkewsv7skvaaky7dtnlmgvdhnqtagdf2rixripxnuxv2kg77hqym6g2vqxe5leeqiac2thalz4fpmumxp7kgrgvvuz4hvrwx4smdym7ibalebngkols6fhuaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvpjxayjs6a6gsbgtc6alf4btfsknnp2dughizg2mxczvyei43ercpnwkg2elbckugvohnchlib2na6n4vj46wkilwuf34izdqbdp23jfpk2wa"),
+ },
+ 4: { # client[4]
+ 0: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazmr6ax5j5zu4cbzbrbkewwiybqrh3a3quqb7g7ijucnyd7gnpj533uao7tber3qvxwy4e5eoorvcrza4zxrx5vvfj23phpvl4u5kdm6dewsz76kehzizg6fj7ij6g2yiepyabade3std5yahnqrgvyarh3mtrubuqr7vizqhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxftc6gvrnd24kyscutnjiybvzgy24wcrqjszirhldprsfeanr4tnzyaaq6txhlsgd3pqmdsv4dd6dmrbrtglrddykuutwgfht5adn2e2p4laqachmhww7flokmltu6zekos5bzebauhmscvxvxu5yms4q5itz6kdtmqaaezb65vr3d4tv7hfdrkjg4hmiiqejjhmbwp7vriodtxocsr66jwhxaacmi5ljkwhozy7iz327zzwiaeqdtartxrleknr5wukf3imuafqy24aab7c6gvrnd24kyscutnjiybvzgy24wcrqjszirhldprsfeanr4tnzyaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdqixmau3cydykhmhyfjeblqbjh6gpstoq2ocybfzpptilivjqlxy2nhddj5kzkovztio3adwgfavjnjf74qbd4w6bfv32hkcmnmgskjfpk2wa"),
+ 5: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaaznv7ubsowbjgzwyijzyfhmrn3jcwie7ikmwph5cxdcezxgtnc5ifel5ymjizmz74mbgac7c36xq3dwxabthrqdxysy7sabwu6porqcxbplpjenl2fih3azkg3kthxd6miq2yd3l73xxvvym3rvw4bhuoi3qzhtn6ylmmcohzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfqpu2mfy2ksainrd6yaxl2vtcwvj5mmqnwtyxctmpqyfmihvu3viyaady5xfcdje6rcdiacuqrkkypvmm42eqahehlnt3ylqsdfcljk7zfkqacvkpun3f6fnyz3dvbyc4fwcvznp6o4wknl6xwnsfer4yghvat336mabh32c56nw4byylsktyom37ayugupvhit5a7wbicp6o2f3ojvodtktaakb6tjqxdjkibbwep3ac5pkwmk2vhvrsbw2pc4knr6davra6wtovdaaajsd53ldwhzhl6okhcusnyoyqraissoydm77lcq4hho4ffd54tmpoaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdqixmau3cydykhmhyfjeblqbjh6gpstoq2ocybfzpptilivjqlxy2nhddj5kzkovztio3adwgfavjnjf74qbd4w6bfv32hkcmnmgskjfpk2wa"),
+ },
+}
+#--------- END stored_shares.py ----------------
+
+class DownloadTest(SystemTestMixin, unittest.TestCase):
+ def test_download(self):
+ self.basedir = self.mktemp()
+ d = self.set_up_nodes()
+
+ # do this to create the shares
+ #d.addCallback(self.create_shares)
+ #return d
+
+ d.addCallback(self.load_shares)
+ d.addCallback(self.download_immutable)
+ return d
+
+ def create_shares(self, ignored=None):
+ u = upload.Data(plaintext, None)
+ d = self.clients[0].upload(u)
+ def _created_immutable(ur):
+ # write the generated shares and URI to a file, which can then be
+ # incorporated into this one next time.
+ f = open("stored_shares.py", "w")
+ f.write('from allmydata.util import base32\n')
+ f.write('immutable_uri = "%s"\n' % ur.uri)
+ f.write('immutable_shares = {\n')
+ si = uri.from_string(ur.uri).get_storage_index()
+ si_dir = storage.storage_index_to_dir(si)
+ for i,c in enumerate(self.clients):
+ sharedir = os.path.join(self.getdir("client%d" % i),
+ "storage", "shares", si_dir)
+ shares = {}
+ for fn in os.listdir(sharedir):
+ shnum = int(fn)
+ sharedata = open(os.path.join(sharedir, fn), "rb").read()
+ shares[shnum] = sharedata
+ if shares:
+ f.write(' %d: { # client[%d]\n' % (i, i))
+ for shnum in sorted(shares.keys()):
+ f.write(' %d: base32.a2b("%s"),\n' %
+ (shnum, base32.b2a(shares[shnum])))
+ f.write(' },\n')
+ f.write('}\n')
+
+ f.close()
+
+ d.addCallback(_created_immutable)
+ return d
+
+ def load_shares(self, ignored=None):
+ # this uses the data generated by create_shares() to populate the
+ # storage servers with pre-generated shares
+ si = uri.from_string(immutable_uri).get_storage_index()
+ si_dir = storage.storage_index_to_dir(si)
+
+ for clientnum in immutable_shares:
+ shares = immutable_shares[clientnum]
+ for shnum in shares:
+ dn = os.path.join(self.getdir("client%d" % clientnum),
+ "storage", "shares", si_dir)
+ fileutil.make_dirs(dn)
+ fn = os.path.join(dn, str(shnum))
+ f = open(fn, "wb")
+ f.write(shares[shnum])
+ f.close()
+
+ def download_immutable(self, ignored=None):
+ n = self.clients[0].create_node_from_uri(immutable_uri)
+ d = n.download_to_data()
+ def _got_data(data):
+ self.failUnlessEqual(data, plaintext)
+ d.addCallback(_got_data)
+ return d
+