Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test blocks #1096

Merged
merged 10 commits into from
Sep 28, 2020
Merged
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,5 @@
.vscode/
.zebra-state/
.cargo/
# Nix configs
shell.nix
38 changes: 27 additions & 11 deletions zebra-chain/src/block/tests/vectors.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use std::collections::HashSet;
use std::io::{Cursor, Write};

use chrono::{DateTime, Duration, LocalResult, TimeZone, Utc};
Expand Down Expand Up @@ -57,21 +58,36 @@ fn deserialize_blockheader() {

#[test]
fn deserialize_block() {
zebra_test::vectors::BLOCK_MAINNET_GENESIS_BYTES
.zcash_deserialize_into::<Block>()
.expect("block test vector should deserialize");
zebra_test::vectors::BLOCK_MAINNET_1_BYTES
.zcash_deserialize_into::<Block>()
.expect("block test vector should deserialize");
// https://explorer.zcha.in/blocks/415000
zebra_test::vectors::BLOCK_MAINNET_415000_BYTES
.zcash_deserialize_into::<Block>()
.expect("block test vector should deserialize");
// https://explorer.zcha.in/blocks/434873
// this one has a bad version field
zebra_test::vectors::BLOCK_MAINNET_434873_BYTES
.zcash_deserialize_into::<Block>()
.expect("block test vector should deserialize");

for block in zebra_test::vectors::TEST_BLOCKS.iter() {
block
.zcash_deserialize_into::<Block>()
.expect("block is structurally valid");
}
}

#[test]
fn block_test_vectors_unique() {
let block_count = zebra_test::vectors::TEST_BLOCKS.len();
let block_hashes: HashSet<_> = zebra_test::vectors::TEST_BLOCKS
.iter()
.map(|b| {
b.zcash_deserialize_into::<Block>()
.expect("block is structurally valid")
.hash()
})
.collect();

// putting the same block in two files is an easy mistake to make
assert_eq!(
block_count,
block_hashes.len(),
"block test vectors must be unique"
);
}

#[test]
Expand Down
6 changes: 2 additions & 4 deletions zebra-chain/src/parameters/network_upgrade.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,6 @@ pub(crate) const TESTNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)]
(block::Height(280_000), Sapling),
(block::Height(584_000), Blossom),
(block::Height(903_800), Heartwood),
// As of 27 July 2020, the Canopy testnet height is under final review.
// See ZIP 251 for any updates.
(block::Height(1_028_500), Canopy),
];

Expand Down Expand Up @@ -93,8 +91,8 @@ pub(crate) const CONSENSUS_BRANCH_IDS: &[(NetworkUpgrade, ConsensusBranchId)] =
(Sapling, ConsensusBranchId(0x76b809bb)),
(Blossom, ConsensusBranchId(0x2bb40e60)),
(Heartwood, ConsensusBranchId(0xf5b9230b)),
// As of 21 July 2020. Could change before mainnet activation.
// See ZIP 251 for updates.
// As of 24 September 2020. Could change before mainnet activation.
// See ZIP 251 for any updates.
(Canopy, ConsensusBranchId(0xe9ff75a6)),
];

Expand Down
154 changes: 17 additions & 137 deletions zebra-test/src/vectors.rs

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions zebra-test/src/vectors/block-main-0-000-000.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
040000000000000000000000000000000000000000000000000000000000000000000000db4d7a85b768123f1dff1d4c4cece70083b2d27e117b4ac2e31d087988a5eac4000000000000000000000000000000000000000000000000000000000000000090041358ffff071f5712000000000000000000000000000000000000000000000000000000000000fd4005000a889f00854b8665cd555f4656f68179d31ccadc1b1f7fb0952726313b16941da348284d67add4686121d4e3d930160c1348d8191c25f12b267a6a9c131b5031cbf8af1f79c9d513076a216ec87ed045fa966e01214ed83ca02dc1797270a454720d3206ac7d931a0a680c5c5e099057592570ca9bdf6058343958b31901fce1a15a4f38fd347750912e14004c73dfe588b903b6c03166582eeaf30529b14072a7b3079e3a684601b9b3024054201f7440b0ee9eb1a7120ff43f713735494aa27b1f8bab60d7f398bca14f6abb2adbf29b04099121438a7974b078a11635b594e9170f1086140b4173822dd697894483e1c6b4e8b8dcd5cb12ca4903bc61e108871d4d915a9093c18ac9b02b6716ce1013ca2c1174e319c1a570215bc9ab5f7564765f7be20524dc3fdf8aa356fd94d445e05ab165ad8bb4a0db096c097618c81098f91443c719416d39837af6de85015dca0de89462b1d8386758b2cf8a99e00953b308032ae44c35e05eb71842922eb69797f68813b59caf266cb6c213569ae3280505421a7e3a0a37fdf8e2ea354fc5422816655394a9454bac542a9298f176e211020d63dee6852c40de02267e2fc9d5e1ff2ad9309506f02a1a71a0501b16d0d36f70cdfd8de78116c0c506ee0b8ddfdeb561acadf31746b5a9dd32c21930884397fb1682164cb565cc14e089d66635a32618f7eb05fe05082b8a3fae620571660a6b89886eac53dec109d7cbb6930ca698a168f301a950be152da1be2b9e07516995e20baceebecb5579d7cdbc16d09f3a50cb3c7dffe33f26686d4ff3f8946ee6475e98cf7b3cf9062b6966e838f865ff3de5fb064a37a21da7bb8dfd2501a29e184f207caaba364f36f2329a77515dcb710e29ffbf73e2bbd773fab1f9a6b005567affff605c132e4e4dd69f36bd201005458cfbd2c658701eb2a700251cefd886b1e674ae816d3f719bac64be649c172ba27a4fd55947d95d53ba4cbc73de97b8af5ed4840b659370c556e7376457f51e5ebb66018849923db82c1c9a819f173cccdb8f3324b239609a300018d0fb094adf5bd7cbb3834c69e6d0b3798065c525b20f040e965e1a161af78ff7561cd874f5f1b75aa0bc77f720589e1b810f831eac5073e6dd46d00a2793f70f7427f0f798f2f53a67e615e65d356e66fe40609a958a05edb4c175bcc383ea0530e67ddbe479a898943c6e3074c6fcc252d6014de3a3d292b03f0d88d312fe221be7be7e3c59d07fa0f2f4029e364f1f355c5d01fa53770d0cd76d82bf7e60f6903bc1beb772e6fde4a70be51d9c7e03c8d6d8dfb361a234ba47c470fe630820bbd920715621b9fbedb49fcee165ead0875e6c2b1af16f50b5d6140cc981122fcbcf7c5a4e3772b3661b628e08380abc545957e59f634705b1bbde2f0b4e055a5ec5676d859be77e20962b645e051a880fddb0180b4555789e1f9344a436a84dc5579e2553f1e5fb0a599c137be36cabbed0319831fea3fddf94ddc7971e4bcf02cdc93294a9aab3e3b13e3b058235b4f4ec06ba4ceaa49d675b4ba80716f3bc6976b1fbf9c8bf1f3e3a4dc1cd83ef9cf816667fb94f1e923ff63fef072e6a19321e4812f96cb0ffa864da50ad74deb76917a336f31dce03ed5f0303aad5e6a83634f9fcc371096f8288b8f02ddded5ff1bb9d49331e4a84dbe1543164438fde9ad71dab024779dcdde0b6602b5ae0a6265c14b94edd83b37403f4b78fcd2ed555b596402c28ee81d87a909c4e8722b30c71ecdd861b05f61f8b1231795c76adba2fdefa451b283a5d527955b9f3de1b9828e7b2e74123dd47062ddcc09b05e7fa13cb2212a6fdbc65d7e852cec463ec6fd929f5b8483cf3052113b13dac91b69f49d1b7d1aec01c4a68e41ce1570101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff071f0104455a6361736830623963346565663862376363343137656535303031653335303039383462366665613335363833613763616331343161303433633432303634383335643334ffffffff010000000000000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000
1 change: 1 addition & 0 deletions zebra-test/src/vectors/block-main-0-000-001.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0400000008ce3d9731b000c08338455c8a4a6bd05da16e26b11daa1b917184ece80f04000946edb9c083c9942d92305444527765fad789c438c717783276a9f7fbf61b850000000000000000000000000000000000000000000000000000000000000000ac7a1358ffff071f7534e8cf161ff2e49d54bdb3bfbcde8cdbf2fc5963c9ec7d86aed4a67e975790fd4005002b2ee0d2f5d0c1ebf5a265b6f5b428f2fdc9aaea07078a6c5cab4f1bbfcd56489863deae6ea3fd8d3d0762e8e5295ff2670c9e90d8e8c68a54a40927e82a65e1d44ced20d835818e172d7b7f5ffe0245d0c3860a3f11af5658d68b6a7253b4684ffef5242fefa77a0bfc3437e8d94df9dc57510f5a128e676dd9ddf23f0ef75b460090f507499585541ab53a470c547ea02723d3a979930941157792c4362e42d3b9faca342a5c05a56909b046b5e92e2870fca7c932ae2c2fdd97d75b6e0ecb501701c1250246093c73efc5ec2838aeb80b59577741aa5ccdf4a631b79f70fc419e28714fa22108d991c29052b2f5f72294c355b57504369313470ecdd8e0ae97fc48e243a38c2ee7315bb05b7de9602047e97449c81e46746513221738dc729d7077a1771cea858865d85261e71e82003ccfbba2416358f023251206d6ef4c5596bc35b2b5bce3e9351798aa2c9904723034e5815c7512d260cc957df5db6adf9ed7272483312d1e68c60955a944e713355089876a704aef06359238f6de5a618f7bd0b4552ba72d05a6165e582f62d55ff2e1b76991971689ba3bee16a520fd85380a6e5a31de4dd4654d561101ce0ca390862d5774921eae2c284008692e9e08562144e8aa1f399a9d3fab0c4559c1f12bc945e626f7a89668613e8829767f4116ee9a4f832cf7c3ade3a7aba8cb04de39edd94d0d05093ed642adf9fbd9d373a80832ffd1c62034e4341546b3515f0e42e6d8570393c6754be5cdb7753b4709527d3f164aebf3d315934f7b3736a1b31052f6cc5699758950331163b3df05b9772e9bf99c8c77f8960e10a15edb06200106f45742d740c422c86b7e4f5a52d3732aa79ee54cfc92f76e03c268ae226477c19924e733caf95b8f350233a5312f4ed349d3ad76f032358f83a6d0d6f83b2a456742aad7f3e615fa72286300f0ea1c9793831ef3a5a4ae08640a6e32f53d1cba0be284b25e923d0d110ba227e54725632efcbbe17c05a9cde976504f6aece0c461b562cfae1b85d5f6782ee27b3e332ac0775f681682ce524b32889f1dc4231226f1aada0703beaf8d41732c9647a0a940a86f8a1be7f239c44fcaa7ed7a055506bdbe1df848f9e047226bee1b6d788a03f6e352eead99b419cfc41741942dbeb7a5c55788d5a3e636d8aab7b36b4db71d16700373bbc1cdeba8f9b1db10bf39a621bc737ea4f4e333698d6e09b51ac7a97fb6fd117ccad1d6b6b3a7451699d5bfe448650396d7b58867b3b0872be13ad0b43da267df0ad77025155f04e20c56d6a9befb3e9c7d23b82cbf3a534295ebda540682cc81be9273781b92519c858f9c25294fbacf75c3b3c15bda6d36de1c83336f93e96910dbdcb190d6ef123c98565ff6df1e903f57d4e4df167ba6b829d6d9713eb2126b0cf869940204137babcc6a1b7cb2f0b94318a7460e5d1a605c249bd2e72123ebad332332c18adcb285ed8874dbde084ebcd4f744465350d57110f037fffed1569d642c258749e65b0d13e117eaa37014a769b5ab479b7c77178880e77099f999abe712e543dbbf626ca9bcfddc42ff2f109d21c8bd464894e55ae504fdf81e1a7694180225da7dac8879abd1036cf26bb50532b8cf138b337a1a1bd1a43f8dd70b7399e2690c8e7a5a1fe099026b8f2a6f65fc0dbedda15ba65e0abd66c7176fb426980549892b4817de78e345a7aeab05744c3def4a2f283b4255b02c91c1af7354a368c67a11703c642a385c7453131ce3a78b24c5e22ab7e136a38498ce82082181884418cb4d6c2920f258a3ad20cfbe7104af1c6c6cb5e58bf29a9901721ad19c0a260cd09a3a772443a45aea4a5c439a95834ef5dc2e26343278947b7b796f796ae9bcadb29e2899a1d7313e6f7bfb6f8b0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025100ffffffff0250c30000000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875acd43000000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000
1 change: 1 addition & 0 deletions zebra-test/src/vectors/block-main-0-000-002.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
040000008392336da29773c56b1649ab555156ceb7e700ad7c230ea7a4571c7e22bc0700f4b084a7c2fc5a5aa2985f2bcb1d4a9a65562a589d628b0d869c5f1c8dd074890000000000000000000000000000000000000000000000000000000000000000ca7a1358ffff071fa5556cd346010000000000000000000000000000000000000000000000000002fd4005005605e4490c2e7fc1acf199d7401e18ab8d2be4c843103a7ebdd34046d5514559e6ecbe29c00b9adf6f1aa49f1d63b9c20fd9bca4d9bbb381cb82f59cee9f387deb34ec4fd6b1e12f656a554bc21db88bd1560a033e64099c0bef439cdd6055aaa4f79c360ad37d1f1df1fbd35214e17fc5a0b3c0d272b1e693d6ba9e5e0ae71c6ff58545776838c18b756bf98a83a6b9739b4dec356117b2b227f6f6ea3f04fd854aadf27b40b302d3fa50719aa02f99c2003b51eab8c64cfd145117054dcadb604ba65a8854a095bd9f02884a65225baf0547a7ee44882b11343d40b1a6511cbc4db1d2fd840a8cd63610d29c47bd5c920fe13c349d1044185cd40854f8e60a212d59e1fe281e8bd1343a682e95f3ea23fb5ca83f9913bbcb11232ffd7165ea4a475273df1f3bb53cb721548b28f772acf56060da5d26fab50c4f8b87781bf28843bea805340531a61f002b5aad9a0427b597af1a08659f1a7b4b6d69d53b13191cf35512bc3521359dda47911112d06ae5410281d918bf53049f8295f067f2b3794a90cc15358e294c6cbd7896108d7c897e4bf61aa72451a280cfce72e0515b8dc510a52743b7615b25ba2f13419d562f6148fa36132622953c0fb74ea0b4870f86ccc1ece9661b29516a2226ea16b7100dbeb718a674eedbbe9d23ab02fe1c634234f3c1275ae9d7f74c754c66dec0af7331fc1407075a06cba62098a9be09d24889e7d0a6cf77d875131fe1278e6fdea2bfd9423903e1cb4502edcef971c60b064d4d8a9703ff324574e3d0535a59ab091355185499545be1baffddf6c2b654e5c30e7e1291763fd70896217d91d876a9be914a8472fa292ea3cfdc4be84f4c645f62d8ccff990ac4f5c84e0775b147d1532e2d4f3a8fb92fda899280a3e42f2b927dbef872ec6058254eb20e2770efde7c57905e7741321e833533e0006344a4c6deb9a78e8496de1ae1464ef8367ae97714700e76658e2390cb9702d1413b333d7f04fb89dd09cefeb34e0ead616cd5d352a2f348758e0f5fc4220c6a0693acc90b8dcd7a372ecb688d86356c151d9703576af8e904adea9941d1a6296774ba62b4dae7bf0a078f740af040c584f0245ed2ffa351f0b550c8b80e192ba1a75eb40fc42d67b722ea04ea947ed53e831fe057153a8bd6897ddcd43cb558d2766fb05640ed0c1d14eae0739b11ec07e34f3ea6acbd9f807b9ea6476bda5964a9fca1819c854680f75857e57fbf3fc50e3f5b0d25cadadcd9b3428b85b70b95080c9423a836e9e9e2cbd485075a29452d65acf3d5762111d70a0fd389ac7214b96b11eb14ae48ff1e4930ea50d8261472fd8d04877af717b4d463c0d9a6cf397b5b91fb1a898b329c4b46b8c350e3c0122e186bc393fe6d361e117963d38e44e0ccf1c45f33440aaebd8f99ad7b019c6411bb070178fb6b76e085e3bdae4c883f1f4112e7db91c519c48769fe96f56350cc8687679747730f0aad3bc58b78f87d162104beee449e55eab45558241f32cb5a0f30fea0f38632adfc8a2b7292ff89641581bb6e0111af26dad9199596ce8d432e6f7d0a7415aacc473acfb8af68c9c6ef8b60c535da095cd3a02598fd82fe20481dc87bf6ed25fb95633dc7ff8bcf3f81c323546084170e567536b5c4ce9392ae1dc1f201d732134597e3c9353416fa40ff8f2628815e9b980f27a9c05adefa779ef1a35fdfe6423e9f671677311971bd91d9aeb6adf4c45769d07df7a24955f4082730fb0d3f6467472f75add86b827a7b664005931130029553fdb62ad9ffdb64b44701c0d94e7c5f5ba2340e641d9e34737e29b47e619659f458a161648c9fb81dddbcc73f1eebc92fd7f7b70356635f0de19912d82c9a978c2750aacbfbeee3ab62e96f7df7ce918fa30101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025200ffffffff02a0860100000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875aca86100000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000
1 change: 1 addition & 0 deletions zebra-test/src/vectors/block-main-0-000-003.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
04000000ed73e297d7c51cb8dc53fc2213d7e2e3f116eb4f26434496fc1926906ca2020083bebac375d107dbfd4a5901765da703c2953acbba6a7125720c1de2ea70364e0000000000000000000000000000000000000000000000000000000000000000cd7a1358ffff071fa5556cd3ad000000000000000000000000000000000000000000000000000000fd40050028fea86051a02aefa905dc4fec427af4f7b8ab3e05bfcd446add3cff9b5ec2100ce57229c1d1d9ae5c1a4f7d7730d7ddeae724e2dabb1c6392d2843775cd32b4e4dae21eeecd1fcf3400a47bf7c9b922ae6d1d02285c8f8d0ed46d2f0c91034127028304071c645a205a0d1dcdd059bb90f5d45d59503b69aaed7fc7a6053c8c9fa918830d4625f2baecf6d720ba6e9694a123be44509b92bc6cb0488324d9fe4aece2a95b895a04f353979ec729dd06b961ee0563680099ac7443333d8e054d27542b517db2448c45df9a95564134b980193b7dd8e850c667bcece58ab9bcaae16b686c748c3389a4b3a621b96bd15655931a3522eab5771770d205ddb84174e518e35a77209b5f1e2d9147effa708c0c3fcb4eeea1d2ad42c787fd99d32ac64053b5230c069ca13dcad0b6cfff7ec5f324eb32a681dc7956ff143b3735a24b3f3dde1a51bd58e833ac831912f6cb00f8d79aac97954efbeaf2696df52711fab278cbc3125594bcd9bc6055e6346349aa627780fb9b9b7c4a0ae161f990d0fca33b41b414766c6111ad1d91386e18a0dee812878a0ffdc491cfb8fce36d76b48d0dc7099e42b9448e041cad883115e44a60b12782ee34cd18a44d9f9110169dc3e675bcd874deb2b13997fd3711bc038531943600addc0559bd77d711836a543cae23f04e146139e209fb5de772a9cb3e0bc10bffb70d0b60d87d5b45758782f311b349e9ee2487100629d121428bf1a7099345cfd0c254b625f2f8c9059256aa1b29e4a78b64461fffc8b4a1f4e11ef9293b10e0223c8853f2b85ad61bab1fb7eef7cd96e291695ea3b00be19f3c03612b3795a503bbc49ecd71a2687ff0c01c94b6e958ee973d9d0532d1bd3e432e3afd153914132f5918d41b9f87a1dbd1fdbdd9024d86753e81ce1eb32bab2d92d8a7017195a1a5b345358139db90f10070c6fd5ab4e3e1f5c49550f632f72f143d191ad70381a6daafaba6bbf36e8ad79bd973039a30dee16a01cf252fe3ccc66b3904a103ec14f12dc9ab6fff540d08a2de25e14d710e421178ae24a8a5dc597e23980744697d079c15eb2a60a6df003ae5be770d1b5cd3187baa87418d8740f5861ae79ddb1aef3bdb3e5e470a61c0fcb8d2673ad050c13bdc57d2855ca1adf9eb2730055dfe1d618d23603499146d083dc2363dd7f80bf94781a24814df6b1a221e8b7b36688a4398621b33b24c996a91f7e13edbf4ffd7f8612db709359a303bb7a5d3689f9e7bf645a4289c36d48dbd73f270044c9c6d550b310ebfd18b7630e7fd61c5cc271310620ff7317b899faef5cff6c9c9defc0326c618f6f6bd225c25d0b56190e18aae433eb8f8458ae252b9ce082134f6b3ffd271753c7f0260fbf46a5e9811999d992c14b6ac88d04829b4d883ea1a78cb6da876930060012ec17bf94f9768f172f525296f78862faa12b9b5170346a647cdd2f5dabfe34c88733f91314b77821f0d7d0b8ccee03b5bec6571ebc66619c4c08e1e11fa38d395d2805160d79152b41f85479e727daf753dad05754db24e533d19f21f23ed4f4f5c91d4c7d597b33f309dc8e8de4711b99b64e9eb580a42ae1b5f2cf51b2729fce62799774d81921e5ba616fac006ffe5b52f007bec41149c41295385cc7d6dd45ee566d7e71d0284708fd842b0e021e81a2c54f9082788295f10101e924954ef8a0f388191144738367bf9d7f5fc078b03bd6da2a3860f4e3840e51fc2432617a9223eda674b4ccf72222d859da4c8b6b56d4d7e49d6201fd3a802daf9fe32612153dbb933b609f2ae9d27cd53354d21ad7b8837097c6ae00ab4cb5848638d4f9ecd52b90c134d1f45cf107d055054018dd95add753e0ffb271b641e4bc95f013745f212021c3d64911901ec7b810101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025300ffffffff02f0490200000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875ac7c9200000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000
1 change: 1 addition & 0 deletions zebra-test/src/vectors/block-main-0-000-004.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
040000007fc6ea65cae94cd84309ed9e0f35a67087cd4bfcf3c95ad6978ebbe5c4f606006e44e2f6865c547769a8ce02e148c83f3f15bfd8afd31e4c05318816b0b91b780000000000000000000000000000000000000000000000000000000000000000d07a1358ffff071f7534e5d60c000000000000000000000000000000000000000000000000000000fd4005008d16b18e21dff532f88087062f3919bee13ca6e204b89baa18973860fdaad24710b3ae6cd68297296c205f997e678d134bfebb3bfc4d61fdd746c45a8a3933f4ad6ca895f3e540b95978b3d1e4530b5059068706b476d21115a054da1ba3d6fa607f19caaaff109008d50ac5c145a9bcd71cb2999aca9144ae2d1d8a981f1f66ee54ef445dc25286eb40d7549a5261f808a133ae1e7dd86b7a21b57b64b0e8d7f38f265cfd881c0808c42029deaa632ef700ee483bdc4e7c95dac5a12235aa5902f470fdb0b5d640a259538b05af5aadaf1cedb48ed1691f3fbc51935728cb28566bb71eca9f1d650355c28ecfc97805820560771b34e6a0ec7c871641ebf574ef5207aaf008042ffa9eef45febf87bb447ee6fa64a726e965dea67491ee0a5a46a83ead4818282be5b72820738a5dd469cd38d8da252cb3ba621880653121062bb5cfbbd648ccd7b6bd9ca43e356006b64b7adf0833bc6c91228e95b0a68540517ccae80ed3eb9346474b8d1780017e85ab11a1f02dbfe8870ba7f9a0b80942a4d785b2661277f730bd2ff8ffb70c4dbdfb3c933b8d3fc0c20e634eae792f1d70c218095570f454c88b0aae3af5b5a1b1fcc9f18f1c29ef2379c560787545a5d404174582fd6d5a57e93964d409aa6bb60586e6a09cace3b2bc38c4e907bbd1da7a4a0445f9c9e0d80d57e4f5889749c89def7f98f6e30811587906d351a3835da235fd5ec8bd77d39c323710f96424954a2160ec2f82ba02620466a901d92b4732ace45ca3d9f86f742ff33ea31d5f4919b89a8504534d6b5199faa1a7ec2db8e61df3ee82dcf377e1ee099727c8654b9ce9c83e93f3b1de5eea0c6d111bc3350f7dfb989c20fbe578461d57d24a92254adbbc390e061fd028c82daf62cfe727bde25046704798bf3e2e87dd87c712185f805d09cf797060be7cb8f9ca6400b4bc5c8256c8ed5b0fd04139d9c5301ae7fd37ea062805bd7fe97b97589705dcec54e2a6c2d15a46e602492382f18afe2d63266229909593a6e9f5ba155f4b4693b563e85fd1abd0e6f81d3f5dc1c9a3fd9b44038d3669428a495ad8a60223876c6b51e6441ce4351a3e3a5657e53065e6c742e2715bb7eb81eabee52009d9f1aa5e5b1c8edf9233f87fe68081d5acbebf1759045cf0e5a95f0953077864dc57d656309574412a0209e097d2f1880fc1de0054c326a0b915a0141fbc03d0e2252cc3c1293cdd6639b86d33862290f8f31702d71c3a3bd61a56d108071c49ee1a5a627f167c4c2d2cfea51428b147e769a50a33adfb8eba3757f0e20646ff72b4115dc1b911a1c7b268f25cbd31a859dc0b51ac67c7f5cecbdb1e2220f7b06d852e2d956d3416067f34305d8c3f1c9f11c77163ec95f23b3f737232836272de1c6fedc76424a878f833e94c498eba5e0190d444b7c19fb4d466c0be3dc804108c4ef1f71910155504301eff1d9b4f5bf6b6e532ab41bdfa30250f05708718cf928681b631949f9fd5bba44cbf750812ab9aa409e19b6f62e911a506effbfd95cbb5699509a9ca7c6b457633d0f19205b5fe05e19f9cf8c71817ec98e4053a7833e3e604e97bea7b62bcdbfccac928d63c1944dd3f8f17d438f0f3d4dde6f5bf9e82d24cf3062c911702af8a8875260733bb369ef5f828370294a32f300d7ad8cf5f4467d9cdd83e48df7806ef1d1cf1a3f393c4f50257d2de8b9a117cec381db8f70519d6a52dd745d0bb4357b562e7339291263ae9d715e733187923689dcae662e96fc59142070336f4b61925f7b3bea72b23a534b458f1af6ad15bc87a5fbb2bcfa1dbef1d4831cfd3d526467fd92228ab16a5a927084c3754e907ab9d5e66d567cb8777bcd53f1b272c7deda98d27a1e16255174b69bcd14e017c38e8620101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025400ffffffff02400d0300000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875ac50c300000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000
Loading