From 7046e13de2d7164cbf2e2bd4dabcac97cae78493 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 28 Mar 2019 18:46:21 +0100 Subject: [PATCH] Use prefixed keys for trie node. (#2130) * Account for pending insertions when pruning * Prefixed trie storage * Comments * Prefixed trie storage * Fixed tests * Fixed tests * Bumped runtime version * Bumped runtime version again --- substrate/Cargo.lock | 94 +++++++++--------- substrate/core/client/Cargo.toml | 2 +- substrate/core/client/db/Cargo.toml | 2 +- substrate/core/client/db/src/lib.rs | 85 ++++++++-------- substrate/core/client/src/client.rs | 4 +- substrate/core/client/src/in_mem.rs | 4 +- substrate/core/client/src/light/fetcher.rs | 2 +- substrate/core/executor/wasm/Cargo.lock | 14 +-- substrate/core/primitives/Cargo.toml | 4 +- substrate/core/sr-io/Cargo.toml | 2 +- substrate/core/state-db/src/lib.rs | 16 +-- substrate/core/state-db/src/test.rs | 6 +- substrate/core/state-machine/Cargo.toml | 6 +- substrate/core/state-machine/src/backend.rs | 4 +- .../src/changes_trie/changes_iterator.rs | 2 +- .../state-machine/src/changes_trie/mod.rs | 2 +- .../state-machine/src/changes_trie/storage.rs | 12 ++- .../core/state-machine/src/proving_backend.rs | 20 ++-- .../core/state-machine/src/trie_backend.rs | 26 ++--- .../state-machine/src/trie_backend_essence.rs | 83 ++++++++++------ substrate/core/test-runtime/wasm/Cargo.lock | 48 ++++----- .../substrate_test_runtime.compact.wasm | Bin 59086 -> 59150 bytes substrate/core/trie/Cargo.toml | 14 +-- substrate/core/trie/src/lib.rs | 9 +- substrate/node-template/Cargo.toml | 2 +- .../node-template/runtime/wasm/Cargo.lock | 48 ++++----- substrate/node/executor/Cargo.toml | 2 +- substrate/node/runtime/wasm/Cargo.lock | 48 ++++----- .../release/node_runtime.compact.wasm | Bin 937543 -> 938309 bytes 29 files changed, 295 insertions(+), 266 deletions(-) diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index 24e763e7aa..07d0e3c4d9 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -903,12 +903,12 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1204,11 +1204,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "keccak-hasher" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1722,10 +1722,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memory-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1921,7 +1921,7 @@ dependencies = [ "substrate-primitives 0.1.0", "substrate-state-machine 0.1.0", "substrate-trie 0.4.0", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2003,7 +2003,7 @@ dependencies = [ "substrate-service 0.3.0", "substrate-transaction-pool 0.1.0", "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3004,7 +3004,7 @@ name = "sr-io" version = "0.1.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3675,7 +3675,7 @@ dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -3703,7 +3703,7 @@ name = "substrate-client-db" version = "0.1.0" dependencies = [ "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-rocksdb 0.1.4 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -4038,8 +4038,8 @@ dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4185,7 +4185,7 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4194,8 +4194,8 @@ dependencies = [ "substrate-panic-handler 0.1.0", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4297,16 +4297,16 @@ name = "substrate-trie" version = "0.4.0" dependencies = [ "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", - "trie-bench 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-bench 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4673,46 +4673,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "trie-bench" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-db" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-root" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-standardmap" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4735,7 +4735,7 @@ name = "twox-hash" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5176,8 +5176,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4743617a7464bbda3c8aec8558ff2f9429047e025771037df561d383337ff865" "checksum h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e" -"checksum hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b03501f6e1a2a97f1618879aba3156f14ca2847faa530c4e28859638bd11483" -"checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" +"checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" +"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" @@ -5208,7 +5208,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum jsonrpc-server-utils 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5521613b31ea22d36d9f95ad642058dccec846a94ed8690957652d479f620707" "checksum jsonrpc-ws-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20b8333a5a6e6ccbcf5c90f90919de557cba4929efa164e9bd0e8e497eb20e46" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" -"checksum keccak-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb9d3670023f4c04153d90b8a557a822d1b27ed702bb015a87cf7bffead5b611" +"checksum keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a02fb74dc1b613522069b5f2023c014756ce121c6c6fb39364c139b0efc39a2d" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" @@ -5249,7 +5249,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" +"checksum memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd87d4d64f7b86d8804bbb419f8ecb187cb8f40a50e91c72848075c604ba88d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum merlin 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a9e97b439f6d38cbe2a4a4aa93f6770c5305f62761b78b1851406c09c87ee2a" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" @@ -5420,10 +5420,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum trie-bench 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "77087d1bce467cf8371a5c0e10e4d925b065ec6cfad8b9cdff1fad4f218c6750" -"checksum trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7319e28ca295f27359d944a682f7f65b419158bf1590c92cadc0000258d788" -"checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" -"checksum trie-standardmap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0e4729504b8102acb1bef3f16e6b64d41aeb1ff0e329081451e8191df0f61ab2" +"checksum trie-bench 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eafa32a8662c06f5bf135984bc1a12821fd38770b5c2f2f9e8750327fcbe3955" +"checksum trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "843af112ba3a8c919cd961edf3cac9272353f5e277ad8678c7023fa70e5c0e2d" +"checksum trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e45632ecaf2b8b4a40b5208383cd659b4e66f58ccd40086467a4614b45781430" +"checksum trie-standardmap 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006314f54f2ea7944a878e66fd93ad7978095bc355f30a2f26ec40f664d86c86" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" diff --git a/substrate/core/client/Cargo.toml b/substrate/core/client/Cargo.toml index f797d93f1f..cfc7eb3e34 100644 --- a/substrate/core/client/Cargo.toml +++ b/substrate/core/client/Cargo.toml @@ -18,7 +18,7 @@ state-machine = { package = "substrate-state-machine", path = "../state-machine" keyring = { package = "substrate-keyring", path = "../keyring", optional = true } trie = { package = "substrate-trie", path = "../trie", optional = true } substrate-telemetry = { path = "../telemetry", optional = true } -hash-db = { version = "0.11", optional = true } +hash-db = { version = "0.12", optional = true } kvdb = { git = "https://github.com/paritytech/parity-common", optional = true, rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } parity-codec = { version = "3.2", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } diff --git a/substrate/core/client/db/Cargo.toml b/substrate/core/client/db/Cargo.toml index 97de2cd7cd..7fc1cc5d95 100644 --- a/substrate/core/client/db/Cargo.toml +++ b/substrate/core/client/db/Cargo.toml @@ -12,7 +12,7 @@ kvdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c kvdb-rocksdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d", optional = true } lru-cache = "0.1.1" -hash-db = { version = "0.11" } +hash-db = { version = "0.12" } primitives = { package = "substrate-primitives", path = "../../primitives" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } client = { package = "substrate-client", path = "../../client" } diff --git a/substrate/core/client/db/src/lib.rs b/substrate/core/client/db/src/lib.rs index 5d8d3cb606..93adb99024 100644 --- a/substrate/core/client/db/src/lib.rs +++ b/substrate/core/client/db/src/lib.rs @@ -40,7 +40,7 @@ use client::ExecutionStrategies; use parity_codec::{Decode, Encode}; use hash_db::Hasher; use kvdb::{KeyValueDB, DBTransaction}; -use trie::MemoryDB; +use trie::{MemoryDB, PrefixedMemoryDB, prefixed_key}; use parking_lot::RwLock; use primitives::{H256, Blake2Hasher, ChangesTrieConfiguration, convert_hash}; use primitives::storage::well_known_keys; @@ -259,7 +259,7 @@ impl client::blockchain::Backend for BlockchainDb { /// Database transaction pub struct BlockImportOperation { old_state: CachingState, - db_updates: MemoryDB, + db_updates: PrefixedMemoryDB, storage_updates: Vec<(Vec, Option>)>, changes_trie_updates: MemoryDB, pending_block: Option>, @@ -310,7 +310,7 @@ where Block: BlockT, // currently authorities are not cached on full nodes } - fn update_db_storage(&mut self, update: MemoryDB) -> Result<(), client::error::Error> { + fn update_db_storage(&mut self, update: PrefixedMemoryDB) -> Result<(), client::error::Error> { self.db_updates = update; Ok(()) } @@ -321,7 +321,7 @@ where Block: BlockT, return Err(client::error::ErrorKind::GenesisInvalid.into()); } - let mut transaction: MemoryDB = Default::default(); + let mut transaction: PrefixedMemoryDB = Default::default(); for (child_key, child_map) in children { if !well_known_keys::is_child_storage_key(&child_key) { @@ -374,22 +374,23 @@ where Block: BlockT, struct StorageDb { pub db: Arc, - pub state_db: StateDb, + pub state_db: StateDb>, } impl state_machine::Storage for StorageDb { - fn get(&self, key: &H256) -> Result, String> { - self.state_db.get(key, self).map(|r| r.map(|v| DBValue::from_slice(&v))) + fn get(&self, key: &H256, prefix: &[u8]) -> Result, String> { + let key = prefixed_key::(key, prefix); + self.state_db.get(&key, self).map(|r| r.map(|v| DBValue::from_slice(&v))) .map_err(|e| format!("Database backend error: {:?}", e)) } } -impl state_db::HashDb for StorageDb { +impl state_db::NodeDb for StorageDb { type Error = io::Error; - type Hash = H256; + type Key = [u8]; - fn get(&self, key: &H256) -> Result>, Self::Error> { - self.db.get(columns::STATE, key.as_bytes()).map(|r| r.map(|v| v.to_vec())) + fn get(&self, key: &[u8]) -> Result>, Self::Error> { + self.db.get(columns::STATE, key).map(|r| r.map(|v| v.to_vec())) } } @@ -405,7 +406,7 @@ impl DbGenesisStorage { } impl state_machine::Storage for DbGenesisStorage { - fn get(&self, _key: &H256) -> Result, String> { + fn get(&self, _key: &H256, _prefix: &[u8]) -> Result, String> { Ok(None) } } @@ -515,7 +516,7 @@ impl state_machine::ChangesTrieRootsStorage for DbC } impl state_machine::ChangesTrieStorage for DbChangesTrieStorage { - fn get(&self, key: &H256) -> Result, String> { + fn get(&self, key: &H256, _prefix: &[u8]) -> Result, String> { self.db.get(columns::CHANGES_TRIE, &key[..]) .map_err(|err| format!("{}", err)) } @@ -559,7 +560,7 @@ impl> Backend { let blockchain = BlockchainDb::new(db.clone())?; let meta = blockchain.meta.clone(); let map_e = |e: state_db::Error| ::client::error::Error::from(format!("State database error: {:?}", e)); - let state_db: StateDb = StateDb::new(pruning, &StateMetaDb(&*db)).map_err(map_e)?; + let state_db: StateDb<_, _> = StateDb::new(pruning, &StateMetaDb(&*db)).map_err(map_e)?; let storage_db = StorageDb { db: db.clone(), state_db, @@ -832,7 +833,7 @@ impl> Backend { transaction.put(columns::META, meta_keys::GENESIS_HASH, hash.as_ref()); } - let mut changeset: state_db::ChangeSet = state_db::ChangeSet::default(); + let mut changeset: state_db::ChangeSet> = state_db::ChangeSet::default(); for (key, (val, rc)) in operation.db_updates.drain() { if rc > 0 { changeset.inserted.push((key, val.to_vec())); @@ -981,7 +982,7 @@ impl> Backend { } } -fn apply_state_commit(transaction: &mut DBTransaction, commit: state_db::CommitSet) { +fn apply_state_commit(transaction: &mut DBTransaction, commit: state_db::CommitSet>) { for (key, val) in commit.data.inserted.into_iter() { transaction.put(columns::STATE, &key[..], &val); } @@ -1031,7 +1032,7 @@ impl client::backend::Backend for Backend whe Ok(BlockImportOperation { pending_block: None, old_state, - db_updates: MemoryDB::default(), + db_updates: PrefixedMemoryDB::default(), storage_updates: Default::default(), changes_trie_updates: MemoryDB::default(), aux_ops: Vec::new(), @@ -1414,7 +1415,7 @@ mod tests { op.reset_storage(storage.iter().cloned().collect(), Default::default()).unwrap(); - key = op.db_updates.insert(b"hello"); + key = op.db_updates.insert(&[], b"hello"); op.set_block_data( header, Some(vec![]), @@ -1448,8 +1449,8 @@ mod tests { ).0.into(); let hash = header.hash(); - op.db_updates.insert(b"hello"); - op.db_updates.remove(&key); + op.db_updates.insert(&[], b"hello"); + op.db_updates.remove(&key, &[]); op.set_block_data( header, Some(vec![]), @@ -1483,7 +1484,7 @@ mod tests { ).0.into(); let hash = header.hash(); - op.db_updates.remove(&key); + op.db_updates.remove(&key, &[]); op.set_block_data( header, Some(vec![]), @@ -1549,7 +1550,7 @@ mod tests { assert_eq!(backend.changes_tries_storage.root(&anchor, block), Ok(Some(changes_root))); for (key, (val, _)) in changes_trie_update.drain() { - assert_eq!(backend.changes_trie_storage().unwrap().get(&key), Ok(Some(val))); + assert_eq!(backend.changes_trie_storage().unwrap().get(&key, &[]), Ok(Some(val))); } }; @@ -1675,23 +1676,23 @@ mod tests { let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(Some(config.clone()), &mut tx, Default::default(), 12); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root1).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root2).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root3).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root4).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root5).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root6).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root7).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root8).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root1, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root2, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root3, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root4, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root5, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root6, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root7, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root8, &[]).unwrap().is_some()); // now simulate finalization of block#16, causing prune of tries at #5..#8 let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(Some(config.clone()), &mut tx, Default::default(), 16); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root5).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root6).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root7).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root8).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root5, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root6, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root7, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root8, &[]).unwrap().is_none()); // now "change" pruning mode to archive && simulate finalization of block#20 // => no changes tries are pruned, because we never prune in archive mode @@ -1699,10 +1700,10 @@ mod tests { let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(Some(config), &mut tx, Default::default(), 20); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root9).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root10).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root11).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root12).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root9, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root10, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root11, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root12, &[]).unwrap().is_some()); } #[test] @@ -1741,15 +1742,15 @@ mod tests { let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(Some(config.clone()), &mut tx, block5, 5); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root1).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root2).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root1, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root2, &[]).unwrap().is_some()); // now simulate finalization of block#6, causing prune of tries at #2 let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(Some(config.clone()), &mut tx, block6, 6); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root2).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root3).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root2, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root3, &[]).unwrap().is_some()); } #[test] diff --git a/substrate/core/client/src/client.rs b/substrate/core/client/src/client.rs index 26ba126b85..699bbcad8d 100644 --- a/substrate/core/client/src/client.rs +++ b/substrate/core/client/src/client.rs @@ -508,8 +508,8 @@ impl Client where } impl<'a, Block: BlockT> ChangesTrieStorage for AccessedRootsRecorder<'a, Block> { - fn get(&self, key: &H256) -> Result, String> { - self.storage.get(key) + fn get(&self, key: &H256, prefix: &[u8]) -> Result, String> { + self.storage.get(key, prefix) } } diff --git a/substrate/core/client/src/in_mem.rs b/substrate/core/client/src/in_mem.rs index fc95e9664b..7f3cdfd8dd 100644 --- a/substrate/core/client/src/in_mem.rs +++ b/substrate/core/client/src/in_mem.rs @@ -742,8 +742,8 @@ impl state_machine::ChangesTrieRootsStorage for ChangesTrieStorage } impl state_machine::ChangesTrieStorage for ChangesTrieStorage where H::Out: HeapSizeOf { - fn get(&self, key: &H::Out) -> Result, String> { - self.0.get(key) + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + self.0.get(key, prefix) } } diff --git a/substrate/core/client/src/light/fetcher.rs b/substrate/core/client/src/light/fetcher.rs index bb6624f91f..893682d5f8 100644 --- a/substrate/core/client/src/light/fetcher.rs +++ b/substrate/core/client/src/light/fetcher.rs @@ -282,7 +282,7 @@ impl, F> LightDataChecker Result, Self::Error>; + fn get(&self, key: &Self::Key) -> Result, Self::Error>; } /// Error type. @@ -285,11 +285,13 @@ impl StateDbSync { self.pinned.remove(hash); } - pub fn get>(&self, key: &Key, db: &D) -> Result, Error> { + pub fn get(&self, key: &Key, db: &D) -> Result, Error> + where Key: AsRef + { if let Some(value) = self.non_canonical.get(key) { return Ok(Some(value)); } - db.get(key).map_err(|e| Error::Db(e)) + db.get(key.as_ref()).map_err(|e| Error::Db(e)) } pub fn apply_pending(&mut self) { @@ -349,7 +351,9 @@ impl StateDb { } /// Get a value from non-canonical/pruning overlay or the backing DB. - pub fn get>(&self, key: &Key, db: &D) -> Result, Error> { + pub fn get(&self, key: &Key, db: &D) -> Result, Error> + where Key: AsRef + { self.db.read().get(key, db) } diff --git a/substrate/core/state-db/src/test.rs b/substrate/core/state-db/src/test.rs index cec5935142..d90c369906 100644 --- a/substrate/core/state-db/src/test.rs +++ b/substrate/core/state-db/src/test.rs @@ -18,7 +18,7 @@ use std::collections::HashMap; use primitives::H256; -use crate::{DBValue, ChangeSet, CommitSet, MetaDb, HashDb}; +use crate::{DBValue, ChangeSet, CommitSet, MetaDb, NodeDb}; #[derive(Default, Debug, Clone, PartialEq, Eq)] pub struct TestDb { @@ -34,9 +34,9 @@ impl MetaDb for TestDb { } } -impl HashDb for TestDb { +impl NodeDb for TestDb { type Error = (); - type Hash = H256; + type Key = H256; fn get(&self, key: &H256) -> Result, ()> { Ok(self.data.get(key).cloned()) diff --git a/substrate/core/state-machine/Cargo.toml b/substrate/core/state-machine/Cargo.toml index 61a99f8e94..d81079b5f9 100644 --- a/substrate/core/state-machine/Cargo.toml +++ b/substrate/core/state-machine/Cargo.toml @@ -10,9 +10,9 @@ hex-literal = "0.1.0" log = "0.4" parking_lot = "0.7.1" heapsize = "0.4" -hash-db = "0.11" -trie-db = "0.11" -trie-root = "0.11" +hash-db = "0.12" +trie-db = "0.12" +trie-root = "0.12" trie = { package = "substrate-trie", path = "../trie" } primitives = { package = "substrate-primitives", path = "../primitives" } panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" } diff --git a/substrate/core/state-machine/src/backend.rs b/substrate/core/state-machine/src/backend.rs index 0acbf27857..14e60b140a 100644 --- a/substrate/core/state-machine/src/backend.rs +++ b/substrate/core/state-machine/src/backend.rs @@ -112,9 +112,9 @@ impl Consolidate for Vec<(Option>, Vec, Option>)> { } } -impl Consolidate for MemoryDB { +impl> Consolidate for trie::GenericMemoryDB { fn consolidate(&mut self, other: Self) { - MemoryDB::consolidate(self, other) + trie::GenericMemoryDB::consolidate(self, other) } } diff --git a/substrate/core/state-machine/src/changes_trie/changes_iterator.rs b/substrate/core/state-machine/src/changes_trie/changes_iterator.rs index f524b0799c..ad70117984 100644 --- a/substrate/core/state-machine/src/changes_trie/changes_iterator.rs +++ b/substrate/core/state-machine/src/changes_trie/changes_iterator.rs @@ -115,7 +115,7 @@ pub fn key_changes_proof_check, H: Hasher>( let mut proof_db = MemoryDB::::default(); for item in proof { - proof_db.insert(&item); + proof_db.insert(&[], &item); } let proof_db = InMemoryStorage::with_db(proof_db); diff --git a/substrate/core/state-machine/src/changes_trie/mod.rs b/substrate/core/state-machine/src/changes_trie/mod.rs index 0119c3ca31..c29131cc0c 100644 --- a/substrate/core/state-machine/src/changes_trie/mod.rs +++ b/substrate/core/state-machine/src/changes_trie/mod.rs @@ -77,7 +77,7 @@ pub trait RootsStorage: Send + Sync { /// Changes trie storage. Provides access to trie roots and trie nodes. pub trait Storage: RootsStorage { /// Get a trie node. - fn get(&self, key: &H::Out) -> Result, String>; + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; } /// Changes trie configuration. diff --git a/substrate/core/state-machine/src/changes_trie/storage.rs b/substrate/core/state-machine/src/changes_trie/storage.rs index 4eb8db0de9..decc332c1a 100644 --- a/substrate/core/state-machine/src/changes_trie/storage.rs +++ b/substrate/core/state-machine/src/changes_trie/storage.rs @@ -92,7 +92,7 @@ impl InMemoryStorage where H::Out: HeapSizeOf { pub fn remove_from_storage(&self, keys: &HashSet) { let mut data = self.data.write(); for key in keys { - data.mdb.remove_and_purge(key); + data.mdb.remove_and_purge(key, &[]); } } @@ -116,8 +116,8 @@ impl RootsStorage for InMemoryStorage where H::Out: HeapSizeOf } impl Storage for InMemoryStorage where H::Out: HeapSizeOf { - fn get(&self, key: &H::Out) -> Result, String> { - MemoryDB::::get(&self.data.read().mdb, key) + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + MemoryDB::::get(&self.data.read().mdb, key, prefix) } } @@ -128,7 +128,9 @@ impl<'a, H: Hasher, S: 'a + Storage> TrieBackendAdapter<'a, H, S> { } impl<'a, H: Hasher, S: 'a + Storage> TrieBackendStorage for TrieBackendAdapter<'a, H, S> { - fn get(&self, key: &H::Out) -> Result, String> { - self.storage.get(key) + type Overlay = MemoryDB; + + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + self.storage.get(key, prefix) } } diff --git a/substrate/core/state-machine/src/proving_backend.rs b/substrate/core/state-machine/src/proving_backend.rs index 81d68352c8..4d85791faf 100644 --- a/substrate/core/state-machine/src/proving_backend.rs +++ b/substrate/core/state-machine/src/proving_backend.rs @@ -21,7 +21,7 @@ use log::debug; use hash_db::Hasher; use heapsize::HeapSizeOf; use hash_db::HashDB; -use trie::{Recorder, MemoryDB, TrieError, default_child_trie_root, read_trie_value_with, read_child_trie_value_with, record_all_keys}; +use trie::{Recorder, MemoryDB, PrefixedMemoryDB, TrieError, default_child_trie_root, read_trie_value_with, read_child_trie_value_with, record_all_keys}; use crate::trie_backend::TrieBackend; use crate::trie_backend_essence::{Ephemeral, TrieBackendEssence, TrieBackendStorage}; use crate::{Error, ExecutionError, Backend}; @@ -40,7 +40,7 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> H::Out: HeapSizeOf, { pub fn storage(&mut self, key: &[u8]) -> Result>, String> { - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new( self.backend.backend_storage(), &mut read_overlay, @@ -54,7 +54,7 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> pub fn child_storage(&mut self, storage_key: &[u8], key: &[u8]) -> Result>, String> { let root = self.storage(storage_key)?.unwrap_or(default_child_trie_root::(storage_key)); - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new( self.backend.backend_storage(), &mut read_overlay, @@ -66,7 +66,7 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> } pub fn record_all_keys(&mut self) { - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new( self.backend.backend_storage(), &mut read_overlay, @@ -116,8 +116,8 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> H::Out: Ord + HeapSizeOf, { type Error = String; - type Transaction = MemoryDB; - type TrieBackendStorage = MemoryDB; + type Transaction = S::Overlay; + type TrieBackendStorage = PrefixedMemoryDB; fn storage(&self, key: &[u8]) -> Result>, Self::Error> { ProvingBackendEssence { @@ -151,7 +151,7 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> self.backend.keys(prefix) } - fn storage_root(&self, delta: I) -> (H::Out, MemoryDB) + fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)> { self.backend.storage_root(delta) @@ -181,7 +181,7 @@ where { let db = create_proof_check_backend_storage(proof); - if !db.contains(&root) { + if !db.contains(&root, &[]) { return Err(Box::new(ExecutionError::InvalidProof) as Box); } @@ -198,7 +198,7 @@ where { let mut db = MemoryDB::default(); for item in proof { - db.insert(&item); + db.insert(&[], &item); } db } @@ -210,7 +210,7 @@ mod tests { use super::*; use primitives::{Blake2Hasher}; - fn test_proving<'a>(trie_backend: &'a TrieBackend, Blake2Hasher>) -> ProvingBackend<'a, MemoryDB, Blake2Hasher> { + fn test_proving<'a>(trie_backend: &'a TrieBackend, Blake2Hasher>) -> ProvingBackend<'a, PrefixedMemoryDB, Blake2Hasher> { ProvingBackend::new(trie_backend) } diff --git a/substrate/core/state-machine/src/trie_backend.rs b/substrate/core/state-machine/src/trie_backend.rs index 5de6c8837b..b152d7fea1 100644 --- a/substrate/core/state-machine/src/trie_backend.rs +++ b/substrate/core/state-machine/src/trie_backend.rs @@ -19,7 +19,7 @@ use log::{warn, debug}; use hash_db::Hasher; use heapsize::HeapSizeOf; -use trie::{TrieDB, TrieError, Trie, MemoryDB, delta_trie_root, default_child_trie_root, child_delta_trie_root}; +use trie::{TrieDB, TrieError, Trie, delta_trie_root, default_child_trie_root, child_delta_trie_root}; use crate::trie_backend_essence::{TrieBackendEssence, TrieBackendStorage, Ephemeral}; use crate::Backend; @@ -63,7 +63,7 @@ impl, H: Hasher> Backend for TrieBackend where H::Out: Ord + HeapSizeOf, { type Error = String; - type Transaction = MemoryDB; + type Transaction = S::Overlay; type TrieBackendStorage = S; fn storage(&self, key: &[u8]) -> Result>, Self::Error> { @@ -83,7 +83,7 @@ impl, H: Hasher> Backend for TrieBackend where } fn pairs(&self) -> Vec<(Vec, Vec)> { - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new(self.essence.backend_storage(), &mut read_overlay); let collect_all = || -> Result<_, Box>> { @@ -107,7 +107,7 @@ impl, H: Hasher> Backend for TrieBackend where } fn keys(&self, prefix: &Vec) -> Vec> { - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new(self.essence.backend_storage(), &mut read_overlay); let collect_all = || -> Result<_, Box>> { @@ -126,10 +126,10 @@ impl, H: Hasher> Backend for TrieBackend where collect_all().map_err(|e| debug!(target: "trie", "Error extracting trie keys: {}", e)).unwrap_or_default() } - fn storage_root(&self, delta: I) -> (H::Out, MemoryDB) + fn storage_root(&self, delta: I) -> (H::Out, S::Overlay) where I: IntoIterator, Option>)> { - let mut write_overlay = MemoryDB::default(); + let mut write_overlay = S::Overlay::default(); let mut root = *self.essence.root(); { @@ -154,7 +154,7 @@ impl, H: Hasher> Backend for TrieBackend where { let default_root = default_child_trie_root::(storage_key); - let mut write_overlay = MemoryDB::default(); + let mut write_overlay = S::Overlay::default(); let mut root = match self.storage(storage_key) { Ok(value) => value.unwrap_or(default_child_trie_root::(storage_key)), Err(e) => { @@ -189,12 +189,12 @@ impl, H: Hasher> Backend for TrieBackend where pub mod tests { use std::collections::HashSet; use primitives::{Blake2Hasher, H256}; - use trie::{TrieMut, TrieDBMut}; + use trie::{TrieMut, TrieDBMut, PrefixedMemoryDB}; use super::*; - fn test_db() -> (MemoryDB, H256) { + fn test_db() -> (PrefixedMemoryDB, H256) { let mut root = H256::default(); - let mut mdb = MemoryDB::::default(); + let mut mdb = PrefixedMemoryDB::::default(); { let mut trie = TrieDBMut::new(&mut mdb, &mut root); trie.insert(b"key", b"value").expect("insert failed"); @@ -208,7 +208,7 @@ pub mod tests { (mdb, root) } - pub(crate) fn test_trie() -> TrieBackend, Blake2Hasher> { + pub(crate) fn test_trie() -> TrieBackend, Blake2Hasher> { let (mdb, root) = test_db(); TrieBackend::new(mdb, root) } @@ -230,8 +230,8 @@ pub mod tests { #[test] fn pairs_are_empty_on_empty_storage() { - assert!(TrieBackend::, Blake2Hasher>::new( - MemoryDB::default(), + assert!(TrieBackend::, Blake2Hasher>::new( + PrefixedMemoryDB::default(), Default::default(), ).pairs().is_empty()); } diff --git a/substrate/core/state-machine/src/trie_backend_essence.rs b/substrate/core/state-machine/src/trie_backend_essence.rs index b429e7aa04..8101126c39 100644 --- a/substrate/core/state-machine/src/trie_backend_essence.rs +++ b/substrate/core/state-machine/src/trie_backend_essence.rs @@ -22,13 +22,14 @@ use std::sync::Arc; use log::{debug, warn}; use hash_db::{self, Hasher}; use heapsize::HeapSizeOf; -use trie::{TrieDB, Trie, MemoryDB, DBValue, TrieError, default_child_trie_root, read_trie_value, read_child_trie_value, for_keys_in_child_trie}; +use trie::{TrieDB, Trie, MemoryDB, PrefixedMemoryDB, DBValue, TrieError, default_child_trie_root, read_trie_value, read_child_trie_value, for_keys_in_child_trie}; use crate::changes_trie::Storage as ChangesTrieStorage; +use crate::backend::Consolidate; /// Patricia trie-based storage trait. pub trait Storage: Send + Sync { /// Get a trie node. - fn get(&self, key: &H::Out) -> Result, String>; + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; } /// Patricia trie-based pairs storage essence. @@ -63,7 +64,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: /// Get the value of storage at given key. pub fn storage(&self, key: &[u8]) -> Result>, String> { - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { storage: &self.storage, overlay: &mut read_overlay, @@ -78,7 +79,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: pub fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Result>, String> { let root = self.storage(storage_key)?.unwrap_or(default_child_trie_root::(storage_key)); - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { storage: &self.storage, overlay: &mut read_overlay, @@ -99,7 +100,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: } }; - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { storage: &self.storage, overlay: &mut read_overlay, @@ -112,7 +113,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: /// Execute given closure for all keys starting with prefix. pub fn for_keys_with_prefix(&self, prefix: &[u8], mut f: F) { - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { storage: &self.storage, overlay: &mut read_overlay, @@ -145,7 +146,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: pub(crate) struct Ephemeral<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> { storage: &'a S, - overlay: &'a mut MemoryDB, + overlay: &'a mut S::Overlay, } impl<'a, @@ -171,7 +172,7 @@ impl<'a, } impl<'a, S: TrieBackendStorage, H: Hasher> Ephemeral<'a, S, H> { - pub fn new(storage: &'a S, overlay: &'a mut MemoryDB) -> Self { + pub fn new(storage: &'a S, overlay: &'a mut S::Overlay) -> Self { Ephemeral { storage, overlay, @@ -187,10 +188,10 @@ impl<'a, where H::Out: HeapSizeOf { fn get(&self, key: &H::Out) -> Option { - if let Some(val) = hash_db::PlainDB::get(self.overlay, key) { + if let Some(val) = hash_db::HashDB::get(self.overlay, key, &[]) { Some(val) } else { - match self.storage.get(&key) { + match self.storage.get(&key, &[]) { Ok(x) => x, Err(e) => { warn!(target: "trie", "Failed to read from DB: {}", e); @@ -201,15 +202,15 @@ impl<'a, } fn contains(&self, key: &H::Out) -> bool { - hash_db::PlainDB::get(self, key).is_some() + hash_db::HashDB::get(self, key, &[]).is_some() } fn emplace(&mut self, key: H::Out, value: DBValue) { - hash_db::PlainDB::emplace(self.overlay, key, value) + hash_db::HashDB::emplace(self.overlay, key, &[], value) } fn remove(&mut self, key: &H::Out) { - hash_db::PlainDB::remove(self.overlay, key) + hash_db::HashDB::remove(self.overlay, key, &[]) } } @@ -231,11 +232,11 @@ impl<'a, for Ephemeral<'a, S, H> where H::Out: HeapSizeOf { - fn get(&self, key: &H::Out) -> Option { - if let Some(val) = hash_db::HashDB::get(self.overlay, key) { + fn get(&self, key: &H::Out, prefix: &[u8]) -> Option { + if let Some(val) = hash_db::HashDB::get(self.overlay, key, prefix) { Some(val) } else { - match self.storage.get(&key) { + match self.storage.get(&key, prefix) { Ok(x) => x, Err(e) => { warn!(target: "trie", "Failed to read from DB: {}", e); @@ -245,20 +246,20 @@ impl<'a, } } - fn contains(&self, key: &H::Out) -> bool { - hash_db::HashDB::get(self, key).is_some() + fn contains(&self, key: &H::Out, prefix: &[u8]) -> bool { + hash_db::HashDB::get(self, key, prefix).is_some() } - fn insert(&mut self, value: &[u8]) -> H::Out { - hash_db::HashDB::insert(self.overlay, value) + fn insert(&mut self, prefix: &[u8], value: &[u8]) -> H::Out { + hash_db::HashDB::insert(self.overlay, prefix, value) } - fn emplace(&mut self, key: H::Out, value: DBValue) { - hash_db::HashDB::emplace(self.overlay, key, value) + fn emplace(&mut self, key: H::Out, prefix: &[u8], value: DBValue) { + hash_db::HashDB::emplace(self.overlay, key, prefix, value) } - fn remove(&mut self, key: &H::Out) { - hash_db::HashDB::remove(self.overlay, key) + fn remove(&mut self, key: &H::Out, prefix: &[u8]) { + hash_db::HashDB::remove(self.overlay, key, prefix) } } @@ -269,33 +270,49 @@ impl<'a, for Ephemeral<'a, S, H> where H::Out: HeapSizeOf { - fn get(&self, key: &H::Out) -> Option { hash_db::HashDB::get(self, key) } - fn contains(&self, key: &H::Out) -> bool { hash_db::HashDB::contains(self, key) } + fn get(&self, key: &H::Out, prefix: &[u8]) -> Option { hash_db::HashDB::get(self, key, prefix) } + fn contains(&self, key: &H::Out, prefix: &[u8]) -> bool { hash_db::HashDB::contains(self, key, prefix) } } /// Key-value pairs storage that is used by trie backend essence. pub trait TrieBackendStorage: Send + Sync { + /// Type of in-memory overlay. + type Overlay: hash_db::HashDB + Default + Consolidate; /// Get the value stored at key. - fn get(&self, key: &H::Out) -> Result, String>; + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; } // This implementation is used by normal storage trie clients. impl TrieBackendStorage for Arc> { - fn get(&self, key: &H::Out) -> Result, String> { - Storage::::get(self.deref(), key) + type Overlay = PrefixedMemoryDB; + + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + Storage::::get(self.deref(), key, prefix) } } // This implementation is used by test storage trie clients. +impl TrieBackendStorage for PrefixedMemoryDB { + type Overlay = PrefixedMemoryDB; + + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + Ok(hash_db::HashDB::get(self, key, prefix)) + } +} + impl TrieBackendStorage for MemoryDB { - fn get(&self, key: &H::Out) -> Result, String> { - Ok(hash_db::PlainDB::get(self, key)) + type Overlay = MemoryDB; + + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + Ok(hash_db::HashDB::get(self, key, prefix)) } } // This implementation is used by changes trie clients. impl<'a, S, H: Hasher> TrieBackendStorage for &'a S where S: ChangesTrieStorage { - fn get(&self, key: &H::Out) -> Result, String> { - ChangesTrieStorage::::get(*self, key) + type Overlay = MemoryDB; + + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + ChangesTrieStorage::::get(*self, key, prefix) } } diff --git a/substrate/core/test-runtime/wasm/Cargo.lock b/substrate/core/test-runtime/wasm/Cargo.lock index d8eda0e88e..771ffe97e3 100644 --- a/substrate/core/test-runtime/wasm/Cargo.lock +++ b/substrate/core/test-runtime/wasm/Cargo.lock @@ -611,12 +611,12 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1153,10 +1153,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memory-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2019,7 +2019,7 @@ name = "sr-io" version = "0.1.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2255,7 +2255,7 @@ dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -2369,8 +2369,8 @@ dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2404,7 +2404,7 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2413,8 +2413,8 @@ dependencies = [ "substrate-panic-handler 0.1.0", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2469,11 +2469,11 @@ dependencies = [ name = "substrate-trie" version = "0.4.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2753,21 +2753,21 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-root" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3048,8 +3048,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" "checksum generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" -"checksum hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b03501f6e1a2a97f1618879aba3156f14ca2847faa530c4e28859638bd11483" -"checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" +"checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" +"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" @@ -3095,7 +3095,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" +"checksum memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd87d4d64f7b86d8804bbb419f8ecb187cb8f40a50e91c72848075c604ba88d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" @@ -3225,8 +3225,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -"checksum trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7319e28ca295f27359d944a682f7f65b419158bf1590c92cadc0000258d788" -"checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" +"checksum trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f23230c31251bdbdba89cd9caa0cbe2aa9e4aa5f92a80e6eb6296bb290e9146" +"checksum trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e45632ecaf2b8b4a40b5208383cd659b4e66f58ccd40086467a4614b45781430" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" diff --git a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index ae9fc72beb7355a46404889f50b669607544129d..84893ab509842d425054aa28164eb30c61aad6a9 100644 GIT binary patch delta 4385 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 delta 4428 zcmb7Hd2|$I67R2ja!#1^1QI#JWHOLra&-6f8G>XG!=Z#LghOTM6B0s#IRJN`BqFPb zg24}YsJM^i>6#UnMcdWvt_rKbiwDTcDWb40Ai9U>>OP-)yshq;90>cz&U@WeU)A^3 zSM~dP+mkO`Fvg<WVs@9t*N)S znK7-gSzkdE;iDhrfS(_@<2s5a?ltl1(a;n%29s0yEf$x-}IDu5>A(Vl#C3$F5n&=frB z(`=Hs^|6b&BZ;Zm(e@TKx~e|b+SuF{GhonG-`qq@$1i*GN6yIUvu>&Njj`sYSQDsM zo1p&6lNXwrHUtq-7YEGd#Z5zyYv2MCee0qkTXksBxw9dkvUz`|e$Y7ogTN8AaE&wz?9 z2cLSj0K))tte+vGsXy=>g7G*aI@4YrJ49t(NzC1qNhWuob@*q|Lfg=vcEBLb<4GuB zpK8cRLIVC%a|aT!zUoeh0kw1DhIc+1_namIC_oef81VAYb+~D@klh0bDUxuQ(G8GsE>iSuxMy_*Z2b4t zrKlX|tto)brmxwLqF3TL0ZI;Z!}^h#Uu)n;2GKF5Sxd&e&!TC!M!Fk{*o2H-={LrQ_f_{tpuuT z&9)T)0X7)PUsJT)PRScgTH*{ z_~7At&t4qbi?jDs zp$T@~o_EODM%PR?0N_;BHlPVZUBJSi+sR=k#iLzlpt4{%dT=s9zLC*uO*!El+l)K* z<|N14nElk=G9Q|N-+Ar!jGNuE?2Q*e@bxHoX1u-=>Jhy$FOe7ZZ!DTIaL{1vATfAH zr)hM#z5^%6<4g9!v4fPPyA0;bPpoUwmA7>?{$!#mtn!{e(QGjZU+4DiDtT4*Q< z)bRfOJS5;Z`$J^eE_Ye{EUxQ5g|G~eA80%FV?q9c_EKYesziBq87U7l|Vnh*(sm=AO@(9MV-l7RNWcw(O%=e<8F=^_O) zarFH=I>rGP0^Q>zO(;O`fro_W-!Lv5B=1bfkAfWj*7VQcl#s6n`Orb~nZP@~90vQj zK;0dIZiFWdo{=7Ren-DzCpeotpy-$PB;=*AV6dT&6Y_N+FNJk`fMx)F6(|Mt98f>d zzXH7p=ob)`1BNFFzN0`xK(mOB_@*!>z#fqTPfjvTCs}pbq3= zp!WgI2D%6qIKZS@OHfUYQSq-n*iEx0BO8h#2`VR=vdLiec;ir=(F|VaWkKUPU6G`$yDIV4 z6WMsu8Htt*g_Sr#VMSBbOhv_&Cw9|7g@`H17SD4Mr%Cv4C)#O6;8;Uo6(b_4n!+i# z^<*I(F(SOln3g0eD#NlC-g7dT$#IOt@FpwrCZ`G|lFIUurH`$yY!`WqPK>}!r_*rRY1+>!qAW*P zozq0i6eKBtXPxGAU^Z)U25&?n8l$j6-sH+VYVS%c%=R;a6)`v!V$c~&GNd3rbGj;v zGi8x8)rh3?ied5j1K13Oh)mYhRbAmVRkgU#(mveAfhXC1PLV`eGgYv_=!z+i!=Im- z#ELS{@`@w~rY1;E9#q;CD@p?vaO>VuGt?2_;z0v^@OX z$Gl&cSVqtwe#H`H0a6rC{6z6vj3qJ=0nXeKCCL&bxSWo`VYr$q_{~oQKTL!i7iHa& zB}rA-3b?T5!56jo{9M1LXrd7@OjspDW-yg-jU9s@rbc>h-XHhRzHoj!3R$eCNB}-q zVE71UOuE4p7yphLg-=sK{5=)GqdfU|5?pL=buPA^>h6TGRiAbuTHtvRvI2@sWjV>1 z3YT7TS{w}d;;;f)5EWBmMTTP(gJ&btZ+sobwkLn+ZT^<_*0z{tE~{^fwKuJ)Z!+-q zi{kC7E*pl(3M$X=8q4c5(_^ugWiho8?)NnrE^nCbXjXjG5+BX>56p}G$ZTmgjX5}c zsUS->BZg#%oS*ScmMFd%p zP0p;vmo5dfEKP${h17;FrA8EK{wWZR+o~tVX)rg^xQxV3H zWm%JCo;O6%u<)Ii$I~pQ83Lz6HN$~Ga^uG?FUw{Ga6)GpCBQMPQp!Y1Ilkz>dxy|S diff --git a/substrate/core/trie/Cargo.toml b/substrate/core/trie/Cargo.toml index 9d93cbe599..a75aac2343 100644 --- a/substrate/core/trie/Cargo.toml +++ b/substrate/core/trie/Cargo.toml @@ -13,16 +13,16 @@ harness = false [dependencies] codec = { package = "parity-codec", version = "3.2" } -hash-db = { version = "0.11", default-features = false } -trie-db = { version = "0.11", optional = true } -trie-root = { version = "0.11", default-features = false } -memory-db = { version = "0.11", optional = true } +hash-db = { version = "0.12", default-features = false } +trie-db = { version = "0.12", optional = true } +trie-root = { version = "0.12", default-features = false } +memory-db = { version = "0.12", optional = true } [dev-dependencies] substrate-primitives = { path = "../primitives" } -trie-bench = { version = "0.11" } -trie-standardmap = { version = "0.11" } -keccak-hasher = { version = "0.11" } +trie-bench = { version = "0.12" } +trie-standardmap = { version = "0.12" } +keccak-hasher = { version = "0.12" } criterion = "0.2" hex-literal = "0.1.0" diff --git a/substrate/core/trie/src/lib.rs b/substrate/core/trie/src/lib.rs index 071f49d875..999f1e67c9 100644 --- a/substrate/core/trie/src/lib.rs +++ b/substrate/core/trie/src/lib.rs @@ -32,6 +32,8 @@ pub use trie_stream::TrieStream; pub use node_codec::NodeCodec; /// Various re-exports from the `trie-db` crate. pub use trie_db::{Trie, TrieMut, DBValue, Recorder, Query}; +/// Various re-exports from the `memory-db` crate. +pub use memory_db::{KeyFunction, prefixed_key}; /// As in `trie_db`, but less generic, error type for the crate. pub type TrieError = trie_db::TrieError; @@ -42,8 +44,12 @@ impl> AsHashDB for T {} pub type HashDB<'a, H> = hash_db::HashDB + 'a; /// As in `hash_db`, but less generic, trait exposed. pub type PlainDB<'a, K> = hash_db::PlainDB + 'a; +/// As in `memory_db::MemoryDB` that uses prefixed storage key scheme. +pub type PrefixedMemoryDB = memory_db::MemoryDB, trie_db::DBValue>; +/// As in `memory_db::MemoryDB` that uses prefixed storage key scheme. +pub type MemoryDB = memory_db::MemoryDB, trie_db::DBValue>; /// As in `memory_db`, but less generic, trait exposed. -pub type MemoryDB = memory_db::MemoryDB; +pub type GenericMemoryDB = memory_db::MemoryDB; /// Persistent trie database read-access interface for the a given hasher. pub type TrieDB<'a, H> = trie_db::TrieDB<'a, H, NodeCodec>; @@ -313,7 +319,6 @@ mod tests { use super::*; use codec::{Encode, Compact}; use substrate_primitives::Blake2Hasher; - use memory_db::MemoryDB; use hash_db::{HashDB, Hasher}; use trie_db::{DBValue, TrieMut, Trie}; use trie_standardmap::{Alphabet, ValueMode, StandardMap}; diff --git a/substrate/node-template/Cargo.toml b/substrate/node-template/Cargo.toml index 53874bb181..786f49023b 100644 --- a/substrate/node-template/Cargo.toml +++ b/substrate/node-template/Cargo.toml @@ -19,7 +19,7 @@ exit-future = "0.1" parking_lot = "0.7.1" hex-literal = "0.1" parity-codec = "3.2" -trie-root = "0.11.0" +trie-root = "0.12.0" sr-io = { path = "../core/sr-io" } substrate-cli = { path = "../core/cli" } primitives = { package = "substrate-primitives", path = "../core/primitives" } diff --git a/substrate/node-template/runtime/wasm/Cargo.lock b/substrate/node-template/runtime/wasm/Cargo.lock index 34fc8036ed..6db886a520 100644 --- a/substrate/node-template/runtime/wasm/Cargo.lock +++ b/substrate/node-template/runtime/wasm/Cargo.lock @@ -611,12 +611,12 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1153,10 +1153,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memory-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2053,7 +2053,7 @@ name = "sr-io" version = "0.1.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2420,7 +2420,7 @@ dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -2534,8 +2534,8 @@ dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2569,7 +2569,7 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2578,8 +2578,8 @@ dependencies = [ "substrate-panic-handler 0.1.0", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2603,11 +2603,11 @@ dependencies = [ name = "substrate-trie" version = "0.4.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2887,21 +2887,21 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-root" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3182,8 +3182,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" "checksum generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" -"checksum hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b03501f6e1a2a97f1618879aba3156f14ca2847faa530c4e28859638bd11483" -"checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" +"checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" +"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" @@ -3229,7 +3229,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" +"checksum memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd87d4d64f7b86d8804bbb419f8ecb187cb8f40a50e91c72848075c604ba88d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" @@ -3359,8 +3359,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -"checksum trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7319e28ca295f27359d944a682f7f65b419158bf1590c92cadc0000258d788" -"checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" +"checksum trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "843af112ba3a8c919cd961edf3cac9272353f5e277ad8678c7023fa70e5c0e2d" +"checksum trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e45632ecaf2b8b4a40b5208383cd659b4e66f58ccd40086467a4614b45781430" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" diff --git a/substrate/node/executor/Cargo.toml b/substrate/node/executor/Cargo.toml index 572aa9dbcf..3c2e9a688c 100644 --- a/substrate/node/executor/Cargo.toml +++ b/substrate/node/executor/Cargo.toml @@ -6,7 +6,7 @@ description = "Substrate node implementation in Rust." edition = "2018" [dependencies] -trie-root = "0.11" +trie-root = "0.12" parity-codec = "3.2" runtime_io = { package = "sr-io", path = "../../core/sr-io" } state_machine = { package = "substrate-state-machine", path = "../../core/state-machine" } diff --git a/substrate/node/runtime/wasm/Cargo.lock b/substrate/node/runtime/wasm/Cargo.lock index 396d377ade..4ad70d1134 100644 --- a/substrate/node/runtime/wasm/Cargo.lock +++ b/substrate/node/runtime/wasm/Cargo.lock @@ -611,12 +611,12 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1153,10 +1153,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memory-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2087,7 +2087,7 @@ name = "sr-io" version = "0.1.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2564,7 +2564,7 @@ dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -2689,8 +2689,8 @@ dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2724,7 +2724,7 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2733,8 +2733,8 @@ dependencies = [ "substrate-panic-handler 0.1.0", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2758,11 +2758,11 @@ dependencies = [ name = "substrate-trie" version = "0.4.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3042,21 +3042,21 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-root" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3337,8 +3337,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" "checksum generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" -"checksum hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b03501f6e1a2a97f1618879aba3156f14ca2847faa530c4e28859638bd11483" -"checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" +"checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" +"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" @@ -3384,7 +3384,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" +"checksum memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd87d4d64f7b86d8804bbb419f8ecb187cb8f40a50e91c72848075c604ba88d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" @@ -3515,8 +3515,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -"checksum trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7319e28ca295f27359d944a682f7f65b419158bf1590c92cadc0000258d788" -"checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" +"checksum trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f23230c31251bdbdba89cd9caa0cbe2aa9e4aa5f92a80e6eb6296bb290e9146" +"checksum trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e45632ecaf2b8b4a40b5208383cd659b4e66f58ccd40086467a4614b45781430" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" diff --git a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index 98058fe83361cf9906d0499e87134a23e901d921..53ad4d8a909ab9e0a795ec9ec146d3d3b1eba6b5 100644 GIT binary patch delta 77526 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

^)$A2~m4>Mj?2*WIlr-H~hMfGPkjddRtH zU^!rx^pJbeo5Cu>PN0$5VcO?%E;-``jwBS)d&w?1^tmbI8butvk%Okpf{5O7)LV2cYf9g? z0<;;k%ncn;G#alQV{emt%k|~cW}Aq;0&u^#Ib{DYP>?`R=r3@**z46_$T@DZ`c=x5 z?@+ZsLV5wH+DA6Du=;)EgLFQW=c`xo<3}^-3xmIs2hoat{*_#Wz!vU{LZ|2E?SgIy z=W<`U4Ilavw0_xBoB+%FA?nOTyrbO@@jB%t6#v@9r-7XDU(2x;>aafs`!_ON{pAu? z#+iO{Q<|9-nC6+)1n?Umhs(=pBoVN>KQhz7{pE1zgsFVhOBg!9?8fE+a%(>QR|pws z4(q*va&vMXn>a>}gF^$2y$#L{lz%3;D+b9oP@tYRSZ;^g&%MF&QN~8%_+ z$(=E|#&G#NNJVxK>kSBa6@5y7l*p`f^ ztK`*v4TUMLrSK%@bNJ&sc?@3E>pEWE%BDi>1bG(*SrbrCod{(oBC5tg#zX^gMJCDf zd;)G?H^eyRTFv8Ze_n@^bL5?2Xno1f@Mr^0)J)zJ9J8!_XXde4f13 zn{M@O^JS6q(=TAxLb)HGx)drek_+YVBDz@TW33uoKKj^2@<^`iMsg|atf+@Bkx%(L z_gzNW)a~kOa`ls!^_OeqPX&JGGIZJ~FJ|L($0j+8p*28%q{~j4bak^lGvJkFcL>d% zL_25q8OzRhzg)|^pV{l{oBeWcf6w6Er0U_=m7nDe#vRWx6;aA`d)x@m4#t0`LeZ7bJ7eO&1%3RXaz(gd@1#aQHtSk*~8%n08dIoHGfhkIJuJ z-H7}}#;Y69;}>}a`x(N1m9MhYO~-K6TRO4ja_7;B4MQ^O#4J{MpC0?+ro^-Ixcnuu zIQI#;c6MWW&l5C7oAl(9GTtKIx(xhI%gy-e#oVw`A(yJ2>4t_0Rk;>!>^mn+X5R2@y}!hvaZX1CB260^_i9NcJm7qxgpo$$Bj0M zK$EBDCT78I;2BmasCe_$oEQh*f3h|6W7^c+F!H9{Sblbw)GRo92RE@7H?w768b`G( zA`x@kusqA$ECL_M#o>CET#yD8c+2GdR>Lv+z*}-T?md5A1A5~pz8hvvuvhMg-N=~i zs5EYeXMf2F{Kh0Gb_a3#%B(ECBj@*EIZl6YM?S&$sL7D|Z?CCn4;B8F-^*SjFzIhO zC?~e^Z+Rh~I$3}39$K2@m6MS-<}&bL-mT7=XC24fhV$){p~oW>IoHDGM{*~tX{h%Y zdp314Aec~?o+SsunsCJz(jFteOd>F(!JsEd*zFh^fw50< zX_{CKffG;V0^S2Q=p~G%yzVno20=A32u44XOZ!-gwzhf-?0qJel*f|hZBFXzgE8n@ zul*cVOyuy(U*IBU<2L#$Q`sw|aEK|EI)tR42XJME^0C(xz3~&5o#}j|{^y)}RdBsM zS63a%M-r{6E&)oz{OifS7D&ppFI~gwRNYoiz$0`DCUWhlIc5E#mAr62KnWsr8K`Wp zCpwh?FSllT)k^Q2OSvjLRuXM-%3~(`3%;1?l|oTA5x<^PfFHs7JLn@ za6DEiY}wg3?YTD(gMXZ|!XPU;_Ba%$)XVN1Cj zF#SvsMPwGZJRWejiziic;f$eD=A9PTSR@mf!{XzM4XN z{WMKkghBc03i%$itgd8W$;cYYzu0qqR1HKRzS#P0O{EF58fUc?4WZPitz=;mdLRtJ z>M3>b?c54*w2sn}y@0s7N?8m#)K$u}C;H5~N+QEIDSoY|v}FjqL<6H6-!)JQBb?L* z%3bzCU(ryhL7BH3DIZ~KgT_kX$}dpJj1%riXq)OrUymew4iJS|!$rW5Z^=~wvkX@S zmCpZry6~OGBs8{HfOUfIj}wGS&Iu?)8O{ml!su~Mcn-arA8ANd)yH zr5GZ%{6_}Xr+$Q3PlO#GDfKaMv{mS4MF|RCK&!S&DU6M4tAt~PrEQh&CK{Gu_sUVn zR|@#V5~4vcC6$DBI9G}AT|0vSH?~7cc%heRuQXz~Z4B>VG_<;dh0KYlixej)Q@Pt8 zp*%vJgrPoirvuf4ULCR1&tXbO?Co>d*-;sVpzD3C)WTrG$4YVR(T7=yUKlYwx|7m^GW&F6ZC)3zwWA3lra01^;HL= zKUY*_W9R)H(a=>BL-lr_E7h`P!~agm{P_!|x5WdklOhifG*}t(zz@GvI^k);jxUvD zi`jU%oZhGpG8^oeacf%Xr?kh;cIl^l%*dE{;A_Qrl*iE@=jjNP=&v-SU3W--r7*EF z!yCHl03|p4Mky1205$-*iC0bwPht$D4p8bKNSzH-?h5a)(kyi*D`=S41BVhR=kzTX zv>1kyTuJ|a81~bVZJ2by(K0+tFE9d0)jIXDn4-t7WiUmwYpodRwHu^E(NRjnY~H9R zk5XolVh}M}$;EiqW4-to<%}=-LF#_fmFtE>WcK@(aBnHHSIla&Oc4U0?hM=sFg9$4 z(mMd!=}IMv&C!)XR6qM!%(BoeLkXo@*CR3%H{o(=hSJdIcY3fa5O2dWd}bz7iGZ-( zN`&PjV{8lPBU631(%Wb3ZjwRGl0&f&oZhVj6P!D{6}q=#I(rw{gH(ix-S;Sl!NKqV z-?T?L#5U+7_9|g^dJ1KJrc%>q4Z-uvZaEz6M-;!exc#L)f%qdz8KPp3s^HYeA5ju$ zigp~usj8r#IZEW-UO#b68Be#FJD*f?({1L#zbix8wM}P~1`4~TH@u{D3c>kZ_ej|k zn5R9hO&hsQ6+mW-9^CkB6fV&Ada}bF5{kg4yX+%B=c#)jYO*~d=Y49>CfmaZl^;#E zM^iXxvb_MGu@e?gw%76+f^iAK$8!nc39u>lOd9?#Q|z^LUbF3yoXl$O`Sw!O)~>ns(N;Vl=jIc=72pF$ z=GtRHpJy-5{)9j0*~?o6sp1Fo?H%wnMSZ@VEGujQb{)Z{FRE(`3fJP~67vqknY z5VH`wYLytc(BAU35(_Cl^m}^|$XsMk@kC~4*Fcy7&}6Z_o+rf(TNmTgx!92di_H;W z-7jF@5_{v*bDLR zw?OkX_Egkcd#$w>g9<735T3dbnx@!;f>Sr{wAG<^I{dVkFNM$1hx$()&aAc9pjz&A z_JrVj^!o*9ad!o1>+EF&D7ML-$g*I~6!qiKtLxDp-0&|;((vq1v$skqICh9f#YrGpu40IyhRD*DwX zX@y)O!q>N?+P@R{p-kAY(O#HvdtswJuIfsBvx(mMi$ql-mgmtH9K^b$*hkVs&avD# z5TSm>j9)@XvvrNJ<;U)7PV%C&Y1=ZP-qsvop|1n`k%0NbhOPDl-xYX0Y^*w44(Fs*R{QN zd}{{DzR^DW-#L3q-Tn5VDhdxj|6*?cpmW^=84rSCu*^6iyFYB3Cd+?Tz=e2AM z>9uS)c*?Fqjf$M!H7a$=ZoH0-6=3=)dpU-#d#CJ!q3vn=HGDj}_V4xtdiq-Lch-KJ zvEzD|^Y#M_FD8`w!`{Go0v8|G@HZ9kFW%}~4def?7h`wyZGTYV+pzMIy+2isy=-r1 z?B%1c;7)^twBm|AzjA`nW8Zi5->%@bOSk!J4=MDE9b%l&q@1t-KeY?!^(SgGSd#O& zF8pcl$D&4?_CD(Z)^IC|8syW%_)wpHIcuv|zi!{iYTi49s_qHHGu_yc@YQg-7Pkz& zbnrfpc~#DHeeUiVuj_O8P(PJRo`B`_DmU#*Ie#_>&WEXa*qrIN?Y*H#q{9aW+_slu z<6+Hh`#@F#ivDHKPmgZ+({$q2_kTDxLS%ya57wNTL8HtUUj4Ut1)7{&8D$BbOFx%Q5m;L z7v5}|4CliU<-H=*1z0UGQjNr*Sfn}&m)ibFwNfFmxQ$h0k;b-wzdyrGn~?FiF*AgwIvJLie@3&AdR(-^Ga*||58d+^~Uk)0nw4{IW)x|FUeO@&CU7c zlX|7n>Q9Uv)E|{mzoI9E^s*Dx%{uNcyGEiKgMo_Gl4|3KYsIDdYi8phGcmTEEd zXKm0@t?e0ah`y|)if$MuZ@}qRY6PV|Y^5%yaPEg{Oa9~rJor#;kX^b}Yqg!^c?5bi zvU|D}afW_x2;Y)E&|VEIG<7bn;Mab0=nXPC_;gT9d%viFzsO=7FctHJZ>rP1gPKpB zG7KfV`3!F#reETbu(5+$!t0$8Obdoioz*ai?5NtaMI|WOQJqPc*xOO9&$j8gK30R7 zW!NA_M?~Z?Y%uyhcU-UWiJG6kHXC}MPU^P|=bd#?Tk}`j4buDmOI;%V^C6<1*h9?_ z{2v`L-3Y0ve;?6(daG%SCm+=heWBt{^&LA3_r6rC;L&HPKI$?<@H_jJ+THIgL-Av= z;arXiWXry4JUP0I>T6IfZ0)N?QT+G5>PM&^m+z;d^VrFiy4oLCVZbGHkaX$<0KKQ3 zSM^x~)v7$#ufL$+5KO*-+C-5|SLgA*j#?63Z1N6Km!UkgQr|aJ{fyO3xolnR#aBP2 z7!-f_sR3&d&z8DRgbT4NP9pvN1 zoaQ6c%03IIgG8D8F2n2*>W?VS*BOaps{|<{)iP|Yes!ceKwx;=WsF*xLCP69OivxF zs!Trlghm91&MRSX;alVloAj3B)XzAdxog`C2{U`XD^4@#J87CZ-wURh^Sxu5`aC$pL?0rLP?8^qy>c!bnXZQN4RiHt)7AXU z?_kz08);U!SdU~u*bKE)w_~0p+TkhvWKNMY)+cc==R8{C7bqzP9qmwutZlp>f|Hd~ zDNw=_9fFU4XdYgx22FmzyF&+OsH6FvEcjrix}HLxS?WWcd<(?cY8?#qMzdA?F(5QF zEL8!uquWby>q^o6m#K?cPHKY{lnPx}AopGe=|8H4FjnD5lp|7rtx`XcjT<}JIoHh` zWu>|xD8*2%WfWk74O}p13d~uh#=Zhz^gk8zK)bX`HGZ7Sy;==pYxRn&Q2;7-(3l1M z;WwIud(4;xqVzlXX<(!*K0k~fbacI8E{t5Gc8|b?Y3vFpYzcIthWMkvj+P?uOHs+` z-EbhAzSsvJXH8M_F&)OIsQA;0J7GnNxu2d(QKwpOI$Fj_&zp{hadJxrOjxTLr~G%; zs&Qyj(*p6TSn+kLA08Z3UZ;-q{+&bXMVnZY6+0`zxpnGiZ}QI9KU|Lsh-^~3HmKFu zRS-9-eeu@Qz>TWJk%4cmqsF_vi9s6u(h4@)_(lZ&_vBYslX@U?TG%vQAzzm^Uwx2g|h z(@7e7Y*F*Ufo-aj=Irb?)PN3yx?O$1PHx(PT%*{dpVDkv5$#So2C)V}&6AY53^%nn zGs)WdU~wAmG3%C3PghrjU0P23jg&QH39+cunRoNIEQej`>L6;b`cAb6`!}rJseVX` zr|&Mcl;1_%E8I?$wFAjzw&5-{FW!Qp*)NV_>O?i6xZQJxIb=FYp_0 zrIxuH>bx@sd`L4>cIty%}ovtlxW>au87#9exee_ZFAU@Baw>Y8xEwhtQ?;J{mNM@_f;as6b+4nq3{Wym; z&Z~cTNi`SLL1F*7ywHCY*VkI(mLGf4V#PPnZ`iVc(&CL09dm1L8 zyn|Xi)A04v1((#zB`+Hkf#wTZH(4~7<_urMPmItl*+-O${&$|OnIy3weg9>(ja(?p zsEy=9wP~%Jm65CAcOI;Z+>vOh!A&$s;DE;8Rpa!PH`U2v&^@Cnk{eYGHmc%t!fFU@ zVV~W>Eey-+SpKRQ^z0vs&U>JSvJlgs9h)Tq+<1?PqodgVhpO=c@ShLWa$b%J1)r$j zl1KjfCn|Y+=%=5kOLLs6V9YZ$kyuj3GgFK<_>}#*>UC=W;d30up%-cp(}z7*8!-Dk zQILkv@1Z@vX%B;!FVzzINXc=S>6|-C2>OMWY7Ez>=W<-62U@=lag5~lMJ_`?cz**5o(fjuFv!>OK`wlTAFZwUiZs4_L+r&l0j~HunxcujoS&mM27~<^ z(HPA0bF{_anV+Lc@O{o4L(tL7>GAVI$uSWg^i`tuW`T}G7Dl#JkNR#Hq&&u_%M0Oy zJdVPaw}-V=dAvQ0t?IyCD1MVQhMRe?gGe9oVU7_w1iv}VkvDYROD_{vu*Zb8T)!3O zIKT=o`^n4ZGJa#aTZS3+k{bGc}E}~bHo)wL#A{VQ>C2?2mRnw7MU*vYo zF@D^qT0X}wq(lejcT6#K+2sWtXUU^TtLun?L8Tn3ac@gQv$xYm2PnSU(^<%MMZAio z`Zj=}MI2F(Rmkxp>A5pw9luzEw^TvT;5n%RIQY?Vj_-qLNt+PexYC@F+Qr#WrLZHv ze2IKoLg7xdqX2wY*kKq3TrC|5aJaA|A3r)7{%Yh1g*EhBw~<90#z{$$A`bGzZe7H2 zle$o+sN<~VNi(hxKA}`M-YnNL-Y7RJ-f@}6+pU=68Y4d^11C*tA=un59Ll@|M|-|u z4!lfoAb4dwO>L#r`{a&-n&DB<{lrto43M=^2=W7Qo+A-R-;tP@bXq|scT zl8!oj|7_S^(our2imjE+l{0+f^=fS%Kw>F}i`;xNKk#6kmg(qHjsh%r=4?W@Z&|c% zyOi2~(LUNifb`N1d=g>~+$`;A=eyP{k>I1PoeeF@INIeo@*wu_{l$Hf>2^9*;{akFs)hOs~)CHg|6LBhHaW(L8=y2|v))02xvMz7Cvw|b1!>T0)^kIpj~vF80}C+mL(7!SAvR&(I}c|E?GqXT=BUqzrQ*gN`oyM|*= z)a;qBETyS4bC%M$nflS14)lxKs^6;ZXvRF;C;mUy$^4m+T-QQ7My9|Fm7ZUT}4_{;Jt>9+sVMQaXKyO%ZG};lC zJz+Z=I-+QtIAO#9osAs9eETdY*a$b4o3r3E3NgN-k)wu(5RJCX;(F`G4t&1KqL`io zkw7ihmGvIZ=~&p-#IetMe9z*5p2znL4!8prHgySD zv>>Rcs2HH|LA*t=6a^F!!wH^vXBHI|6%{-K=I{Tyr*?YBMe+N7U+eO^s@|(y zFI7$Tpkr>o1NpXK+fEO6s$~hH&IZ58lW%+#-8{JR-0;0M8#;GX_~g+4ZfDPq0?)_s z;IBq`v&Jp$lNp){Cs$7>LlPZ_k}RCTwHm zSK^+Xu=6KtfA3;} zW0rUM-A{4cO|Sw+jg`@6P<61TETAK-m86F}ML%FJP(ufHf9iwXV7f#fpESc>ELj21 zIN)XRUeHJ5~6C5}1w z((uyYAG1Std{y}FKN*=Xs={l%Q^weqM6FiM3!lVu<$7nH$+~*y;#=7<^TUg2Fx}I< zo7fZc!@l!d4KEMh9X#e;8qH%_#f>Cc7lc2iy_@G2hS$4$Hy2$Qe!a`ntMYu@`whqA ztMYu@b1^@{gHZPFU&SuF3SET~8!ZYyANq84ZttQnzD)xy?W3#1ukc?gQ(;j^_eLS? z=8ZSf?fEp(8(Y|@%%UFHQlp`$1W?#AUk=FA2A4vT`+;MZL=7E3o}o861fF z5&H?1J65qzmO#K_{VmV%QV|Z8S`PJ;~o1lq5#=gBNytifk*Y}*; z=6`$da$EfL{_C5=D?1i+M-&E8gd-kM%7c}R!O*XV4;a=JGeYIzJK$^$52t;!@KV$P z^>zF6^ra9y%U7`_OT!(Hq5Bzda0~t4u^D}5n|D3e%_-x0?BJSkIc^CkUl!hs57Vs5 zz01O7!BKfN5<96T5)g(-J#+N@55~qK?Rp=T+|eV->NmjH_2P8+vQFSK60Q{qx^H z_+c?e&uzOk{5>5~*>qd@tiLp}xt=S+&xZceG|F|kBfKFMtUPAFXMnZFIewd*lg^LHWeDUrVk!JQJg2;sClG06UbWV_ac zOKG@WR_9K&ow?}U;YKCZMrIDI?mEf)dBBYF0X6s=LhRK?!wY;_9>?ZC7H)<6Ayz#W zp8Y2?RLzAS#a!N>3xCGD-n}mx?Z`6f} zRW?5F!^@wrSn{GTF7Jcb^MH>wA9vtow*Ft?<8u>sgukxiaNnNmM5*U_Gp>8eN0l#e z#hbp|^A{X1eA^e7r~PuPk2YW8)^~DSUkpDN?7ZqDA3@$@^YimQ0(|6#JkV=C&Y_Cf zTz}g8LwleJHJ>jPKfx;(y!Y9;av)>ADY3)0c2nKuEdFA2C z6;+eU8(@22RwWKDp8j_D@#@2l_!VP$fX+gC2O-;hWle*(0MaFAy)JFrB~$pZ-&R!nsCNj;R?3k zU8uB&?}r;W+`j3OhqedK!+9K>sCzze3hoWXr{QN+uG+#re;4}I!40hbd*PN%4nBi3 znI2Z^6!+W?kPbeFPu_-`4?OtT_5jHC@^5zL+~5m&m2rs|oR_~~VpTo}^@$Y9bzU$H z7I^!6;obGzw(tLEZr0xLsiDwfT=@7wxOZs7{jB6e^wf&AZ0LuOtQ*#{g&&3ohqkX} zFMk;B-EbcrfhCWKcNR7`?pm=<9oBMRxWe>gX4CQjiAcM;5Pk(yn;_}-nHC9?4|0P_IQN7;t zt7@;i(OmQT`TKA=T`}H%_nOF>XYUqY;o?Vo zqsuQVYQ6mO_3v=ZFMP)_q{CkJefa6%8diBY+_>fS%lpx9$+?uing=2H<}YWn4u_W$ z`;~uy4mFm&_ycKe&_7i?K+yL+xTlI7J zyDrOEzaDNeo{D=tt5NEeJcv?%UB;gNC49#T-U4>NDD8S$u{faB)$!ED`cN0^(PuK2 zEr;@0zp|{No~OT-lg;}WV=I4!zv2GnY}2o>m7ZMAX8soL6#5t9e+#?2HSk-Mu}^=) zvhX51EFCV0)KZ?%eCc&US0paoEQ|v|i1r={`EaHAg z+IY|V9r235BG>Oo(dduL4Qp7oM2H{#rFA)6cDXAQzGV#7)h%j6`NP5bpfr!OgV`3wrRcjm#oJppP$kI$BRrI5zk~?krKb zrN&hjjq(SDv^;dHUaws6m=!(;;2tN+5?)ufrBt}mpJ5Iee)(7XvXQV6J4}_0g@!>sQe4T*FGE+!oWDFbxrxxCE?rY{ zZ42RNx^t$Yt#D<1Ld2O|?2b0(WI+&97DnLxQ3C`*SF!v%9sjuD39WZ8}b{ zaq_8kd*QKQ$>I4=v)4Na?jgb6-GnA=+;PH4)}fP&a$P5(PKbZ9zV|}mICg>}xYs(m z2F2UQ3oGc_my5axu4B)Q9IXf~+1Rc^efDJ+q4b#d=fjw5!XCa@C}&^I5y+jH>)uts zw*kSxP~fY<1^1SA7lOyk{|&ZaDf?Y1Ib;Y62iR`qt5gAZhOrM+VH5wzTZk-beB^Cy zLilI!DmFSP>?ia=n(zw$jGT*t&&ah;2`iiXIFiqRZB+RPy5hZ*@D>qoPNQavb4zsL zZ*JM2W`y17v&VY~-<0I*LgD#+gb#weji`DD8j^1b;i`VZF5HRoxBkMFB|DJu-u?(L z$gLY7JQT#Q5ylJ@HU*cmrh|l*jb1?)!Ce%os4GsuXAUarR)QdR@*v^oUIFcO@gTBNoNSRA+OxWX9z8WqdiW!7s7({ zh<(HyJx+;fOM$&~xa^?&R&rkD>vTL9`bar`bKr6ezWRL1rtg)FJ46Ml#1bOG;we{Q3r|F@!dW=DL8!f31Ls99W(REHew4%)U*9i3M z^Oe^K9bg*mxJI}hexAxZaj0s-wZa!Llg?TUhT;2xtos>*QqMcw09rPkqG7vk60U6I z-i3tyeJmCFbu@h?2bY$gceBusuDLEj0wNw|xtoQd>|fUjn=ys2xn3Alr;V$Z=WXK+ zhkdGO-U9vc6V~At;d@lG^-@&x7dB|A&1;4`-itEud_Z^znQ%u*`_D>N_2Zd)m62)?os{B1$5#~s4N5{h1Pr_dIwaOa(Z zPQl<^g6|Hyp?856Ub78%32Dlb4xHfp-$LBLdc_*yR^JV*?e7<+w!b<^s!FBo{qie- zUl-ygT(Hdihe#XJJLcCD_Y14B_C`M-9N&2>eqd8=5y)Oo{QFv;m5{eimaNJ>@_^8! zB=pnu?8S$n5#D|STlx>-gl3Q50I|>j3UXAeCqQK^!S4#2l{bl0vCsb@^a{Ok1M9R- zI9{9|!Ue^3%A1xqj?B-ETPJkHucdNVuNPVbL-^9iy^jd9=;uWZ_^T5x+mx-YdZjB;xEPb*w2pe`L^L-2n*=-CLL^PnejKIB1QzU97)-GuUm z!HRACG*$cDb;pR0)d}9i1_k;PX+_-x6Js5lwNR_Y@!AM(PzX1vXVUNiRapx2C-co5ClzJ{7HrPfMbaE>^j z<-;7=qrI00L3_s<79ERL2G126*P6kwbH!EiAs@x(`F`mzO8mJNiWNswTG^N*l$JeG z!n!ek){Y$7(LPv9jXJZbC|H*f@0l0Y|Tt@cz7Q*68bZI=)cYsE5Po`XNmXAH+iV8k#y}n?DbjVNj(?v zIBz}udbe90zG3$r4|-*N$%82C=fqsv^ zbk+MSe!6q>mu&Y<;)9{>_p{4x7MtP6Rm*P{-)*^n12j%>dpKf4&^*_LD#Dd?dABz#J2Gf#2DI4U625OvLYY59A)ZRqRz)`Z!l71bt@S)_}0>rQB~T z#sAgskexkok~OpYG-JlZS#!HjoZ`$dX3m;1+nhCfhTVPq#90$&XS*8HCO&o_WZlss z=T2KInk7e#{q%$4CE`(I57{I(I_jD%yH9M%zS=I!0hhO}yf$3!pB}p^M{xX;5;f><|}}bpNY8``h#4 zgrjfA4KIjy)jQh0&Gr4a*zc&@z?Qr!{`yy|pWCuWjD?Q2LM-^H*dq7yf5clNunyhl zuXfj#PsG7T-CeBvesTNJRxXFieS6GNW7jz-9;kba*9g}11##F>*D5#mJ8{@i_gQZ9 zVX__p~qiqSh@JF%ysFCmfQEYqE$p86K?410+8RlH~pTwK$9CbOneiP@{ zb<25lsB~-e=trVqsdQ(9spE9*W{a;%a2{Zxh8wvy(P=oM9 z#YmvO_ZsMRZzNEXe%ztld=!!KUW-beVn0r%A`Zxq7* zwmlFkw0joP{N=4FqW$KYNWh%{XzhbY~ZU#=SooJNFrCPoW1i>E{aZN2Egc{3sbj|Bw+Q)jTuiBh-Ffe~!tiBhW& z!dIUt4Q#{n+k|$U0lG!YBQCX65(!keVRi^#nJs-7WeE9v30!>vGX_cBQiMNlokv6Q zmuxKb7a#LYM@hS|7TWEgEv1a}&ymVqTnp`gYNstNuJbJ$+3G=3n@~P)H+`C~P4n;p zp~2D!H-3>Xe)&2!k;kv{#jjh({x!HLzm2~1o$FZqB&0vNfJKK$-Q0Y4`_lKWV@prU zm$%;+e|R1Hfye9X3w<6~&qkk|$FJ{;Z;I2)C!?H~XS0t^&X+UXmtMY}9e0X1Co0aB z+PL-br*~Y>u0AE7uRmT{&%QWCYJ*=wMTSV-T{3@l2IH32AyOOp<=KU0e&;dl5UTRK zBFfk29vvdd!K&wOj^Ge)AaJODBybAg3;3h?QyhL>hy+?7{@idRFa&Ta{%AdJKs@m# z9)Dpz{u0FNzWA+p?~K1Q5Krah@v8#c5K!^grDj6l8H&RnE}wECFW_lJQ3YN`MTm~a ze~)*n(7lN7;EVqa@3i0(i1!s7sEbyX1gemN=SLL6xmSyyYjTr)j}%rG;no4imFNYJ z_(jdM14X!g?)(kX{G6xkpP~% zjF3N*YGH~iKh=3!I9*qPz0_o8R0FSh?xSMXNrLFtXO(bXe zB=$42uh_WLrM7N1d!8ut_6lD%d<4R!-gK@l8@D!IHvU0dgKYQ;;AD-EO~WJ9#>?i! z;zo&^exFS{WJ3x8&(`0lPDty*Ug<5huA;0gkn?92-Z=@uxlJR1_J9KbHNe(@G^GzW z@mStAz%;^_0rm$R3`lG5;DQ5G35?3NXQ<$D>@lNt# z5Fi++`;3}gV9`7S4e6Zawe`_=#5-}(`hac$c>fuV;jBD>cb(kL&OCxh-ldl#kt;Y& zpR74S6@>k|!9L(}y7d@V(nl5}j^@nsfHY+HRCq(P9gtS^L#PB*dUqSIkq47_8H|W0 zkiey9@3!8ArD34Q&jwFMT78!dx~7fzbb$?S-d3nDCmjKFz5pq!yh`uVz65;!Z1>Uf zxN)E@U{urgBj)3$eY+OgX`rRf=Jl8hU7Ocq?iGyGc{iUfzWVR;fZOZ{)TYj!3pDU3MA6IH0>JYsmZyx&VPzUwlWpTI!w4CF)w6j^|s64H||69~T zyX+{-ZC4BJD$w#i`=dJds)hF9qB?JA%if=ruk!%l^XH6OXrC;ieWopYWwg}I6}zK+ zw3CWxzd0@vXpM|_0CofPOTF$0&q4f9z!88X1^wv?!p9(VaQRH6+>7%K1D94BJsz%C zz8g`D9Qz%zi&iV{Wxk#``%fy|!k6!Xs$GBFZN~wb3-4mX&|l#p`AoSjR~)`G?X3?5 zc%*#x0VG~g#UnU;5iKD`{SgonfK59_0wVxd;IA(JlrE6~?ek3oBwic=mnUAl_joUS z2>r_!qH{%I80+t-*-#x}3{|23HzGqmLHc@$$ku!E$UGRBjEuQ7IlCz1MMdGKkS|}u z%aN9!cy3;McU0A!FfRi+nlEO5Q6&P;)x>=dxYUL8)JK|M-04NQ2Y}00O z@;5-{{MSFmRM4Cv-0A2Ep79Ig3oWhbF7!0+le&3Jn)2avZvUr|z;&uiyB3znm3VJT z*m(S1o&Y{|e-7!V0@gv8m=--eV|w>j=uT9WFFii_fKnBB1ewspqK8Yqm53|zq5`#5 zXads7hM;FG-uYbMngzw1zI-1*;iT235!aCt@wCEw$mO93__c;|BybhD3*Kq@H3Xz( z^Q&)uT!dCr9Djy%aK(mexWD}`KIH;|QF!M}iNmWw%a=9L-@=AZklM1ny(Q5#{@T4< zptowF-vWBS%D|U9<+T%O6$PzllCLV4__88YdOig@Z!U%B`Xu&tAMHXPEpNuRpyi95 zX#Eb|#Xi~RW4jGqlqD z?S1|2-w#_0lJGZADt_auNgZ?uCm~dNrURXL7mw!)kJ2vd&Q6<!GGvjorO_m1Q^0jMLQGMzpJ+owAA`&P^UVhCPO91o2^Kt0 zY8X&q_PTxj~$?TDxDvnwkk_ib{eIB6!(0B{&WTDkH*=2q=y#A*=bivjZ05e zB7xb6e;RNGU^33OA-(Dsw0$_jTw|+5J4i(&=}p~H9B!EM=D;_aXMWuecrx(5%Hy{{ zI!(7OfHdiQ0+O*jG#?%fNKAUV7p@A-!wZ?!%K(WxKLFSg@bV=d;WCUCP5<49?+pz2#df*E{>N;+TtwWeBUapOCI2iHgAfBG6UXbF8Q3#i9 zl=fgzB`Sc+`B7Cd@@60Mb9t?fSELwTi;ViB027b|qyk9V9}n|670q}OpXNW!DSE~r z4!p$GBm&d^U9+236@||SGEE|S)*;Q`y2z^qO@Pub^D?H_fQ~d?Accn)g|E#(lcU*6 z&)G$Z(-7vIg3@n8#$0?XDoWd36kZG5YK^cc-@qPUzSRE5eKl^1M1PGHKQeHi11`C4 z=owsuI}Tz0WZUbjL^1BPJg(RO$ZSoYLN~6(JC``~paj)*iv!O%!PEG9A)Wj^w*d0q zi{YL34p*Fr>_{6X69SM*r`2ZkIIIicuif~_q>G4;X z=ldY&Pw|oi_u-w-p9ij}^49f0M3M)LXJ{cjAWzU9@4PqsTRz#)YhdNkq7lm8SsgnTY#+r z>G9{!b=}dxKMQHyPQ(jo>xVE|X!oCo@fz5Kq2Ps5*srJ!hoZxuad_vGmct#O<>p8+ z?F1j~oLXpigO)4u#kBK$v`cEC-B(nu-yOHyM|)o_v|kpL>sK!8d{Aibx>{&MeG4p# z>fESr!5y^GSME-{^F_-0>IllE>vr>(`+6)gpR~&Eh450HxMBPf7T!$ z8iLyL@uoo=w@>`}4ED8)=d%v^a9;++d8)8?IK8R!NB>>-pY1D( zS8;2;>AdJ8jXdXvgvV)L&Nr9SzKL+h!pKiUar~L*E1JiJDhon`;z}z?;qT^7I)5t{ z`Dl63Z9&WRJEHA|uxqp)@48Nx_=;ZTBPUe9eoQ-&-wnj2+(q%Ehi^c9zoPig2v0{m zsh|FQXos^M;!h<#=Cu>O9ZNrg4up}2p8&WGkeJ%>fZYK7cw`XNMLbpD#Q~8(55SfE zy`9P*0Ex4oiFktR0gnY7jd*In*Zl|&8t|!zpsv3Z5n}=01|-G$1i-$4#{m+jZ_tlD zIag|5wGEv&7~!h`sX%{)$YL3WcxnJWexKZ$ZwpJ3()@FT!hWC6!gmYHt_atY{OLgj z-mn44e58wzDH!MpT&@|s^e4Ed0+%abwc~o_yBYhvPjjy*cpq=`y>kyI5m?Ba^FBZR z7{v1h%mppsU*^N7uxmH70i*J~($C`koyq&+kHkaS2ZhyE8|}3yx`0tF9^BQ|&PSWX zJ1>vJy=cClN8g6LTDc3|Ws5Zy>+(V&ocvpm6My1ie@|^1hs+n)ThqiycBHho^u=J>tXB$ zkGxFk9qKTc-Flgns#Kp*Jn3#WibJf#${9VO!N@8^j7YSNY!g-3&~ zzDtGWci^X*$SsPHZ6NdgoOVd_8)LnSa3=w`uAA}i^BquxJDn=Qmw$03hWL=1E%erT zzY$*V)CVL^$>aI92{+*PBja+UKMU9va4z5wKt426Ku=}}aaD(R{a-mn@)0uNJ;IMR zyoflG2lQl4FEAzw4?La4=jT0~^FAsp(b}f<9MJmJiM%4|&f}W2-l+!4|8ie>lRmD= z>Q^A_AF&&N%j>=YX}tZE&r3z&Wx(Z}XAjc2_DHzNPh46)ez2*4%-tEiyhOrtpEHWW z4+EEXLox0s;Bpm_h-=#nq4?*|BqbzYJ~s$kAd-f5JRsD8zy?6_<7z#I+zQJXLt->eChA&a{&I zBCZeMQ|K8wP}K0Q+PS*s+n@0Y<8TJvc^~ot{t8swc|*DS zt;p>@+7)=`G#rM`D%6;0{npJIAMJ)(XeH3{-XPljXBG}5`0Kp67TPFi{gXFeXIE_c z>%6BH+B2^#3@4TAatl{%dj5J}wGY%n&ZREz0?uqGt1?up9c9(p?fGwfS=ITx(0hbR zj}COcj3``rmU~c1rR6UIpFb^pv{dZ&zj?lZre}Mn_-6c#1>r*u4@Z0(q>F!J6$l^u z2J$C=pI>uKBE0S_*XLYyBhp(Jr7H-Zj`-eyOOQXQzPkbaBGAt#c{e;YvarhMpuT*T zfjqDXVLsBF7Y{xsQsqwGe}RxH&3WEe2v;JkoKx7QJOl5X_wDg@24()XudvsEM+;~S z;F*B`1f;y%oa-%`Qvr$LAHrW9ViC6@f?CWI-f|PbLl8gI7youXe%&Zf*zX3U9^t~C zOOU3cy^~oaU8rYx{8+@Fj4;tu#}kWKn@{MOPbfx2bm0Cm1=;!Yftu5(&KEVq{{SxU zsbZ&jnGcuLWsSzg$meIuhb_4YM>%Pxo`NiBhH8Ms4e2>ApDn#F`m$#8S0U`5dDDT* zyJK*$=I@o(713S{TyByq2}Z|P*P9C3ScE)gT!8@@cqjSr3oK89xqyoS zdF5MOP^b`+xDUZ)7yf=Yh(6){#^LOIIYdW~pV=Pv^W8>UO%^ z*-xwZ3MV>xwu6=iocEdEXXK8P%bi`N$)A<}HGAbcui5^p`+Lcc-uG*!U5{hf+28X| z;$0mlKh08{`EqtfjF-vcC5B7ikWoPwJUoa<~wKEn|I z2>!^>t}0G=4UwcAOf&P0JI|)L?SiDhTBLE&`BG62?nAgfA?2S>tOD+5c&9=i1U=1W ztlU#vw5Jg<8gH$E(A`ULTgyu<1yz>V){N2p3C~Vu1maz?2Dv+WwjM z$Im@CQza>b{KG{sf`i;BzvIP!?8kqEn`_ua@b37U!-}7^(N7TF<)(jE=pESF*WHAl zy}du4t-lGs_5EZ#`+?x+<5}g+fZvQ~R}=hYJbQ&;oe8YjEr8+#W)O@`U~35;JAoY{ z*meTTECuX5fz2nVPhigz95jJNmjV850vkzi%mlWYpfiDeN^r^q7H3kws+JSIsrmeT zPj9#my+YRNUUaN`mN_4POFq6Be?vZ=)00}jt=$KaH+MP}8?)d1fntIYs1kC;=0yaZvM5fRS; zE@#ueIZH`_y}KExOeFK4}g-{vY{_d3XTQ z+avv0%BkXGQrjf@ zvkd%W>X(b$@pCOIKtnMWunW}^j~@>w3Oqx&7ZA$b-Pq6Q<5Ph$6{KmKj_jUs2RP-TU}dgiS2ED$%M zT=I{f_H5wuXF@Hs=hrB>TDN!Yf^|OHX|>Q^1zO%IRK_i{3l5_>KH5dK(E5d?kJi;p zmiTB_2`so8h5(8xG^F~6KW;Vs-E&_pMLh^w?(d|c{AQZJiCb%-eWIv|`8{KIA7;OA zSayPzvsFGUJ3&hll!yJMkEe)v`zO17`MmC{1J#wDH~%1?y-3TrCX`zxe^z^I$*LKw zT@qKdRjI+$!a>sgpykhDUp}0UTg|l{0R43;+jeLEBtXE|vidwrMqXlq+cOF>&u=8sG}4*3+%(z`)RW+Z?7b>8hOcbc!x95)AA zu9Q%mpVr^rMLt?S^e=#xt6)T%Z?8Lz{q0=^T5cY5+E+n)B&UMM{JaAs8-4ZPSxX(> zK|X#4_Spq2cyIn_g}?24eY8|pdJcfr&sBax*gMtX9BJPD6$GI7K zt8otA_;GpbMO*R=C%Nwi0~DF z=L5cdv8UBs3wRpBeme3Tj6gj3oBi<@BOJ`*-*=H`Bm2`YA?uNbdu96Ci1ybpgrv9t%hnet(XK=g*jwhP8;N%|L%V$?~p<9|Gtq6{Nk)MFbV> zMS_> zcs!k}TpW)>4fy>)e<2|G1zdcZAaxKC2i%1MG@by+GrAJ-l?bU7)*<|G3Xi;Bw|hiNK}VTX_7x z=i*0QDb?=?%ArEsH1Nm!&wcpM*z%oB%IEhdcA8Q&%ywkzXV0Hr;d+i-X}l_0&<@t& zo%aHVe{_)LH{{#cRao4tw)(Q#=*!Bh1a?=kH|W=){B3HEv>t9&t{UjiYIiMJ6>l@< zwPe>*_`0te`-#@w@#sw);2=sN7V{(^u_ixRh#Mu{Vvl z@Ax`|+alcr>C z$s%2ZKe&af0!tA=79#(B$c0#NG_vavPtI^2KLrz!;uqfN6|@YH+*$K(iUb_Mo%o}1 zAAWO94z?L#VibIR@XHOZLRvY`jdv3$5rSfWrZspldq;?#;&smgV<}5Z4BO4#KqJZw90uxC4+@>2^Ts zf!6?OXg&jPtqa(fv61U=K#*4|bC2g3Y|T8o>?05p9;KH9-Umo37gdrTS~u6@@9(#I zlYJE+)#GwNT8@)3EJXh_!sO|H9gx%(o<7q{uL_j>-5ZK9DnN)I0g*EQB2V}xbYvRh z{daph?stI1et!gv)Pnym@TuVYkbXSitAJ!^jzp#ed3iF*ZBGI?i5C(uy#Q(17FXc& ze1^QI9N?i71H%ES!e^j1?i~Aj?)mjnX|QzF9iF^BxEl2X=E1viUpyjxT<4s5NGJzI z2mI04@^DAIm;1uB#Qf>h4C+&k-v#gG_~SKt_3m8PjnX}#XetrUq!e4x)O1EktBK}p z-WF+8M9-#^NnKCr$z;Z{G@T89LK;)5sfw!O;^jmtq3UKjQ*kM)cv5Q0ro1ePY~K^o zNu`EiX^B+UFp{Q{&{EkpQ>!r=GH0`-mnLjWQxb|}Sb8#H>e;q_jQ;{7qBu%Am2xaI zu4d9^+F`AqMA^xNZrGW)ZYi0xu4j|SO=a`9Nd4K$m!%ewcs89;Q<w-QlUB3YY(~)xEt^W{ z3Tw4RYG0agj10O}PiJ)1Ftz0Io!GqZrN%K3pvL&mF|r9WlgK19tZIuiI%*k7HKACx zVmPXSCUs@$tx}iLq=^mzQdUi5;^@I{eOYcRuK#RUN3It&Q*k4qWm1lsGO~`Ub!U%l zl~Sb{4b@F***Miao-vhaEdGqtnzh^}RhFi-jGeOWgsmz{GUX)W(Euq9rmP$`& z5}KLFXz7$X)uRkOE%hyR5NW2hgpxE;s&43s^Ss2FPfI;ZRVSWMZ9R^PYL=EUk}hRA z+xxWCCu*YNI;M}BNf=5}O>0bfMj8`Is-|r!x|K$5nrf@8`!iA-w)Gk5glIgQ)iX}Q zLPsPGMN!gB-Y#8KisI8o%E_eT*-RQ&f$Jx-OJA3|HyLlc1FFU`plQcYZS+{m$gsWJ zrJ-jj8O^rRaV?=4sf40sd&I_$rHjSKy0c>JMfQxTw$-znIdz8JqsP=~vnEcR(xZnx zXPRx!a>v-VFlea+rdk$#n${c(-QA0Qu|?`BYnq-^9Zg3}A{A!~o|P^yRgHMk&R~uk z7?pH3)q5~Ac1X?He?O2~Mly<`Ws-@s9k=5K`ihO+Aq^|lm87F7hLTF9op{`G`s%Er zuH2Np{H;`Bg`-;o76w`Td8q|!-B6CPEuyTl!_P^vh^lAI zbUcj=QkIp;##!^7QtxO=NjQnPoj^%;TvxLL*|>r7h-h3%>#4Y-SQ#s0T1sM&8yx`~ zNZMFbhGJNjZee7fm#k8(Yh<8gOkGdd7>biB*`bf6M(lCaBI+oqxN6%OC!S8IiIj3O zo8Lq3R+>(0R>IIwleBF(3FQ=%y}w;*$p*YY6FsFXI!3@w+PapuvO{#HJSUa0RWC?o zrCBRwDwui6jFCvj4fWKK?9l(DChVOTBsHoeY^+NxPy_Q1*$idDQ{;+>hSg%|maS#& zWYSKg*=a9Irl+E1k7YKi^|P(+)}v z*fB3-H9YaS)D%20VcVvqCct5^;GHw3duSiMB%KmTrqIzk*tlV+hJ9u}2|0vW_FqyT zu=JFjwro9v*`TV41il)MYc~}$YoP;dFk?qIP33QScFareU7FJ4I+jjK0~^uOwt4of zYW8?)RJTkWYsofDu-$Ze*r}mu=~@PZ2Nsn|r3`lH z6)79l(^$wx$}%)XMGefS*~+@|vFx&cOShJ0Y(-Tu$4%QZFs{hXUC!l(X-=IzW!Bg! zQ>U2VH4}7815byjGqKbXDUBJgN*70Hg@Dn<)wE%%nwnt;UWGu>okSv@PU`4X^iWzK ze-XQ*uH1~ButypZ$z+r9Bm@dLT?+Di0x`aFwq+0Y!X3rNgia}7UXG1Un&|Hh$4SNG z8osAsVI6?8o>$3Mcas}4`!%U~L{DZQdQ1h9M@y=@#g@D#r5Y>X?Qz2~?Ua^u3?)5j zV6WK;mCbJ|w_(4&CPgAg5Wy1y>If;sG(>U7J`w~!Ss`6W)5+n zHj%iNPC}VVWwK5xk<#a~(Z%NZit)!VkLr~>JLbFV>YOzQ2(%VpNG)xCOW5f-e z^d7~Y7ref@xcY4;PMI}ztUYJq%vlqsjHfC)RJLtuP<%2_0OkiTV-^3A9CqLxseUY- zj>i)YP2ZlY5;zTklyumd$G_w{>S}3`;`C7e&Ct(h18t>KE8$cp42U-YPt;$oJ6sTlGTz|1uH$Ghs)*0QAbP0RV88Q=pifuWf9x^9u(iK znF1C5$tIFu;>oLn?2^|drNzW4Gwm6qwiqVVEiJC0wiyR={F>m6)YcT+^}f`TeX>`I z##F`BQVGoBB&59RsMiLs@u6Juz7&q7?1ZMNS^|n&GLhBn#rTvY&t*_lHPno0rb#aW z8`GWZScea!`B5y=gpy5Q`Xtb!j(R=Y^Z}GPWTHAY)GsJJdPa9{z-K2R9-)=#Dbs{< zVSsBu>si9|52aILj;WzDk}Bk;rdhgvWAGdn|43@g9{f;BMhz{Mj-xN_ES9#1h~13q9;{AEgU;@*3=osc;dFyg^3K9WIACd)U3&Z z^O*9HbRJvxu~aXX&=U!)JS>%TI%8+;<-yC{)ML#VwlRz7vG~E-OjE@ofG!fhl@0ww znjJIJS|)2cY1m74Qpu+No+o5|_e%|8u!b;E!4XrchWVVn4Ih1`LYqS|nqkkRrs`z! zfQ9LbVnh2$u3+!)m*&JU@3L6(&{~bOf@OSraG^`t3LP|dlI_scNg@T}N3|SHi>GXD zWj=Q{<}*x*bRwCxpjaeyRoCN|dPnd&ufZRECN(NmQLi)>KJ;3s?aC^Aa(ehD()sMd z&n3Ckj$0O{TPg#E6uf_Ru!;s};<5wMF)@k&!-O7eJ6SN7JA+rd*_K-qXHGL_nG?q5 zwHpf}opklMlTod7BF?&gAp`~apmci-mMdyyE2xDHUJ-vNID;7jeVumbn zHJMJrl2iW?)IB|V*w>`?CXlI}guVn$tT^j}r?ArwK^a*3wbVRn#UaNH2j;Amh0wQf z9sJkQeNhNl3q?Zrf@-c>$w$~~LAIjMoGm94x51sEb*bt<*;oIQ`a<{9vvJZm(@rLp z%%(T6zTZe4V$hP(uJ%M zj-(xnROm#Cn6{hh<~M9Vos!JOqZZDfm0t zA5|buq12@_Cd42#*~i)F@1y}SGz(gwl7cB}#!b_DBIr|!VlZ7GlXNF*8CE>5nw!zT zl@Yl)EB{`SN^S7Ji~;VbLV7{re-ga0C$5r0&0%$;4@pYf_EYS#@1>40GppFJO;VPf zMXp(WOR$fZ*PidCvY2jb&`qEhpm%Nb%huotUTWjR&~1#A4OVR=(n<6*hHRU^mStFl zB!^XK14-DD*{6fo1zE#3P~Hxd%MI9rhov!5h**XA8noIBCXDtBYyN|DOH@f>#Xy0> zARzo5{i}hKgFdf<0M9 z2f10>ndSuBnmx%LYfdnxxWXj^8wqAHJQd)0rfKYEWxq(HV_;$Flwu`dCud;&CSURA zUk3T=STK^nrW_6b|GP%zq8Y_7bS>@};E8Fp{#DlRSLw}CC|F7KD{6&$A@@D`-qT=n zWH3J9YOpBn21igecvRpib25$su44RmX;3~r3Y!F6 z*nztvsiSl4*Ad&6eYI0kqH!CR7?udkLbx8X`Wp;ih3^qjV8}pJXE3F+q|dT3LAhrX zUL6b#2FNg=gc{0QE;5{tuvsCqbf^smc-Y&8>&N~i zdKj#LEX+6+S!TX;OOJvHs^G+q?!bIa>eg56U_Ch<#ae~X$PHh3Xq<$$zQQ1^U7Gju&(9#t+ z$Y2ActzYvk@Vg1Wl;nmn=n60!vD959GoJb_c!96TKC+yK1`DrD%23QC)D7FR=Y{6@ zP{`wWY`)RyY#QP(ivnLM3Jpb1LPtq13{`q^wogYa z>x83OFcV?BqTADP>xvNcHPx2LFSvGs7xM)|SbfeY95n#QIz0XxYitt32YU|Mi2DCy+i*?ZmPHc?0; zEcavv?sZtvN$0kk`ySJTg__FaBZ^9E#Y|yF#bJ7<+1#dbN(P6=rVm`hu#A!k_GDA} zZ&8vgnCn?J4*!ptwO6sNP31G9(Dfh+EeB>l+{tl$wHqBtC*W^Q!p9Cj8I&J~ec4RD zHVUtijr{;S3vV$5pncEHuN>1Vci*vcvtR^Df}z4bN55*C37_aI&E;9Kcsd0;40VBH z)OO6|y3j=OWGbvh3%L^}89EtCiHVtMXR+_Jt%a;auuBA9h`lGwN{Doe1zXB-8HyVg zp_9mhw`w-)i?}FEm2@U;!FI={TUu2&upe5<-$9*%^IuIsfpD@I3;R*brE2$S41S$B zHjkj`S&F4(Gmq6s%_as z&vAS+mNiE?)^*#(64<0aX23b|JV9$Za_J6?qlGt+9CiEZTZv8;|61l?IPp;y97 zu`P75NAo}%c_93z*b#!@b<*T`&Dt#3R<@yYI4K7nJ&1Vddhzr#p-ViPm2KrgF&q0~ z&|u)vhPMV5#`e%`FSTVmxo-shrD6v(3-c(B{oXj6+)ma=xMwkAA!lHx!S}TzG>A=W z2ZmOD926DWSBzm!xfU>N9FlYTbD<&CC{T1DGd1`{<95n~5@PNQnN(jixDB%vg79Jz`^N1==JgvbM>aYx*ti20$A=RFdD-XL7P^_?ZVHnu#gO0QtER&~t z${c0~v{(4{q4C92MqGI%)RXo25vuBCaXE^CK{~!t49Av(<(~d`sIQmmN*wqUHP~+O zCS@Seb>mgcUYC|6PQ-$r*?~NQKO7E&bdo*PQ63k8kkYZXQDK<7X>@7JPV%)4Eif)k zgXanlOiY&Rgto!W4i`;E)!_MuMydQ4ZOe3)JGz4#No1kLVp~~-8V|0RWvR|`I+De9 z5LEhjLWx651<$&)Gvx%Yc`~CDi%1%f%x@y6d7ZspYEnvO1127H84Ft=+FR%(p6GQ_ z8SFfmS7~Uqx`~aTX;~PSuus?{$HS6_dn1mM2|B6>FLGREhmMz% z5m@37rAg>{Y1(>Fnbt+lV4-1TH4D-glNv5ic3Bsazi@5Q`i!e7$S%uahq}o7BIHj8 zOSa&t#K)qYZ0@73@_-<`40bYwZOtV1Gg4Ms`7ktG(cZsz_ih*f+yJSa})tR(H8Q1gQpF7pD&3SAd$GWl;tE7@l|dsbNBa!9!Iw*=dSA zE26qvE;uoP^?)u=*=vei5rf@}`od94<7rvyr=c#SST`#pwGay(HV@oh*wRYr&S$J% zTpkK#73!CcEdwPDi%e5K52e}raV!^_g;5h)Bs{NJi`Z*Wvg!f0DlT`6W?>LRzs2T8 z0%sTE#ux0pxSWWlOjvMn6WdNuurn#`OV(DEPmdvEjGT%i6=*UxTED_nzA+(pY&Li1 zEPFDl2AdOpZTPD!@B}^O9Aq!3^6^m>(lTve2r?QhYbSe%-H?zwvF-^u3|kEwi`Zj> zo{v4cc;;)iO_Mvd$m@CJ6oqk#ZOdc^q71uc8SQ^Woro$~R1#-9uw=27lCZy_=+5ky zgxnxz$FX4pS2BhHzD?cwHq@Ug+JW^=%2I@+j-|jqjg1#0Wq#+@raA4$neH(TIKZ*- zY(Ue1B9@4o-?P<8xkpTcYbKpC;UUAa0H-}1I?2nlktUZ$O?Y4REKboR(s4Lb?H}A+ zj~ze5m|{&c&QB@Y z$r#Q)!1g{$qQ&RFVQ3!7M88C?NJRBkkoE~~KW&$Kh zHu-C)un!o6ZxYTon6wW14+8qPkj31c^bToRkAkH_ZGsvLZ$A{*c_nOGS{@dq?L?e` z!HEXgzVI*4XS>t#*`@H(V9%8dD{x^mae2uo_D&3&pVyViYE*NuE028))GdoyXD`Sx zT|PG$gVCm>vo<;tmQNN+cu9g)^(41i54nB}J|x)bNz=qJ1L(+^D@q2iUmMEpTf+i? z!+7ij>>r`Ku)@IHag+lRz=7xZN;akT0Rmj-t0lQ^RS>&#YfV(aZ$@%!dca}AUd&q zcr&}Pk31m;%@W=*a9KLHfa6uSl%#1unpI3T&bP--Gv-d6O1n}&&9YVdF9-dQ`&*p9wvD^3(>&{;_B zFv04ylUeb%T>@T;faAr)M zJa+O_a^ulDBu<)u9~oN%knGONlG9x@wy&RjTog<}!JZI$6^4tG*6v`(_Lo<{6P}^P zhIyu7x6+8OV$b!LyY$bJ5|Tk*8#uG0I?C#juK5FK7uYz3c9w1SI-_@w9@QIwI4*!~ z6o@3v1c9R6Su)%!`-}l{8?pkdtgF?-Uxq_;ccB4W2Vvc;!QuI+0*4PxPFRd-^jB&P z+c5zA0|pDu1VH^w<3tzqwYy6yiKqh@-sEYs-R&$JE=dQQ)i{%*sZcWSVZ%;@(e7Zb z+gL6sI3=;yrQKWNJM99e6cz*ySb%Zs;QHzNO8R(}`Se7&ENVKA4yzBQa0b0?nQNIm zQ0@yZsbK(Y>|Do5M5OL#V+TU8;8Yg66(bAR4hAm$K*>lt+Si3Oiped}Fdb3_rWA<* zSPc)d)`R2|W0>Ix!N68=swA7SA1WD073kK?nPE(J2Qm&3{=>A53{ERL36}G zN62_`T)`~B#_>Nu=bANi44^Sw-f*bGEvG`^gTP!@(y!OKXV7+WcO0_AAcK#nCNvWG z&epTX2g^5oV>#UCAe}j=|@V~wx;sw5r{wy3k7@%zA$J_?2(h?bQQP)PDMg* zgRx+th8s$vGw29f)*e4`%GlXcE}S^UdbA{rgK6WvV`-0-h;G2L-Kmqy2O&7Bmdh)_QX5DE1ZLOoMU;I~V7I zvQMxjCqrM+p`t@~#W6W7b{vpoznv_%i-6a{Sqje+))rLPC)vZN$n6`?oQ0!46L7L1 z4XrE%7bEy~D#@mv0<9Y=7IbZ5yD-aPDzJx6k-J84<`mo=9;S>5-kH$YXQv={C>xMJ z(8yCzd$0&ut08i#4EtD)8iz&|Cr6y7JY8~fFLr~1Q*rZ#$ZZ!eSo}kvl}-h5@^T$%2gwxPUFz@>F?B#DI|u4gw9=Owdjj syX{mtDP!=UHN)TpcSR delta 76394 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 v2DX;77Q1bjq)M3Tn1nbVgJx(ZduNz*R(